-1

我正在尝试创建一种方法,该方法使用 TCP 协议侦听到特定端口的连接请求,除了 Windows 操作系统附带的库之外没有其他库。该方法似乎可以很好地创建套接字并绑定到端口;问题似乎出在 listen() 函数上。即使没有对任何端口的连接请求,它也会不断返回零值,这意味着直接来自微软的网站 -

如果没有发生错误,listen 返回零。

奇怪的是,所有端口值都会发生这种情况。它似乎找到了随机尝试端口的连接请求,范围从 1234 到 8000 到 -154326。对于其中的每一个,它都返回一个零值。

它应该做的是持续运行,直到找到连接请求(这是 SOMAXCONN 显然表明的);再一次,直接来自微软的网站——

如果没有可用的套接字描述符,listen 尝试继续运行。

这是方法本身 -

bool listenOnPort(SOCKET networkSocket, int portNumber) {
    WSADATA wsadata;
    int error = WSAStartup(0x0202, &wsadata);
    if(error) {
        cout << "Failed to start up Windows Sockets API." << endl;
        return false;
    }
    if(wsadata.wVersion != 0x0202) {
        WSACleanup();
        cout << "Failed to find a valid Windows Sockets API." << endl;
        return false;
    }
    SOCKADDR_IN address;
    address.sin_family = AF_INET;
    address.sin_port = htons(portNumber);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    networkSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(networkSocket == INVALID_SOCKET) {
        cout << "Failed to create a network socket." << endl;
        return false;
    }
    if(bind(networkSocket, (LPSOCKADDR)&address, sizeof(address)) == SOCKET_ERROR) {
        cout << "Failed to bind to the port." << endl;
        return false;
    }
    cout << "Listening for a connection to port " << portNumber <<"..." << endl;
    listen(networkSocket, SOMAXCONN);
    cout << "Found a connection!" << endl;
}

感谢您提供任何解释/建议 - 提前感谢您!

4

2 回答 2

3

你混淆listenaccept. listen为您的应用程序保留端口,并将传入连接排队。 accept等待传入连接(如果尚未排队)。

listen当没有传入连接尝试时将成功。

于 2013-04-01T02:17:08.797 回答
2

http://linux.die.net/man/2/listen

listen() 将 sockfd 引用的套接字标记为被动套接字,即将使用 accept(2) 接受传入连接请求的套接字。

您必须先调用“listen()”,然后才能调用“accept()”;但“accept()”是接受新连接的调用(并为每个新连接提供一个新套接字)。

这是“accept()”的手册页:

http://linux.die.net/man/2/accept

更好的是,查看 Beej 的指南以获得关于套接字编程的精彩介绍:

http://beej.us/guide/bgnet/output/html/multipage/

PS:

如果您使用的是 Windows 套接字,请不要忘记调用 WSAStartup() :)

于 2013-04-01T02:21:21.467 回答