[英]Why Isn't Port Listening in C++
我正在尝试使用 sockets 设置服务器,而我希望收听的端口似乎无法正常工作。 当我运行 netstat -nlp 命令时,端口不会显示。
int openListenFd(int port){
int socketDesc, newSocket;
int opt = 1;
struct sockaddr_in server, client;
string message;
cout << "The port is " << port << endl;
int myPort = 3207;
socketDesc = socket(AF_INET, SOCK_STREAM, 0);
if(socketDesc == -1){
cout << "ERROR CREATING SOCKET DESCRIPTOR" << endl;
exit(EXIT_FAILURE);
}
if(setsockopt(socketDesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
cout << "Setsocket error" << endl;
exit(EXIT_FAILURE);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(myPort);
if(bind(socketDesc, (struct sockaddr *)&server, sizeof(server)) < 0){
cout << "BIND FAILED" << endl;
exit(EXIT_FAILURE);
}
cout << "Bind finished" << endl; //Page 982
if(listen(socketDesc,10) < 0){
close(socketDesc);
}
return socketDesc;
}
这应该返回连接的文件描述符,并且在任何时候都不会出错。 它稍后会到达它只是等待的 accept() 调用,可能是因为由于端口不工作,没有客户端可以连接到它。
按预期工作。 测试程序:
#include <string>
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
int openListenFd() {
int socketDesc;
int opt = 1;
struct sockaddr_in server;
string message;
int port = 3207;
cout << "The port is " << port << endl;
socketDesc = socket(AF_INET, SOCK_STREAM, 0);
if(socketDesc == -1){
cout << "ERROR CREATING SOCKET DESCRIPTOR" << endl;
exit(EXIT_FAILURE);
}
if(setsockopt(socketDesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
cout << "Setsocket error" << endl;
exit(EXIT_FAILURE);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(port);
if(bind(socketDesc, (struct sockaddr *)&server, sizeof(server)) < 0){
cout << "BIND FAILED" << endl;
exit(EXIT_FAILURE);
}
cout << "Bind finished" << endl; //Page 982
if(listen(socketDesc,10) < 0){
close(socketDesc);
}
return socketDesc;
}
int main() {
int fd = openListenFd();
int rc = system("netstat -tlnp");
return !(fd && !rc);
}
输出:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3207 0.0.0.0:* LISTEN 31807/test
我发现问题确实不是代码。 端口未显示的原因是我在大学 Linux 服务器上运行它,该服务器上有一个虚拟机。 结果,127.0.0.1 的环回地址无法正常工作。 如果我拥有管理员权限,这可能可以解决,但是,事实并非如此。
解决方法是下载ubuntu并在我自己的电脑上运行,从而使环回地址有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.