繁体   English   中英

为什么 C++ 中没有端口监听

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM