我正在尝试创建一个方法,该方法使用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;
}
任何解释/建议的话都表示赞赏 - 谢谢你提前!
答案 0 :(得分:3)
您将listen
与accept
混为一谈。 listen
为您的应用程序保留端口,并对传入的连接进行排队。 accept
等待传入连接(如果尚未排队)。
listen
将成功。
答案 1 :(得分: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():)