主要的
...
CreateListenSocket();
Accept();
...
服务器.cpp
...
void MCServer::CreateListenSocket() {
// Create a socket and bound it as listening socket
_ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (_ListenSocket == INVALID_SOCKET) {
cerr << "Can't create a socket!\tError >> " << WSAGetLastError() << endl;
}
// Bind the ip address and port to a socket
sockaddr_in hint = { 0 };
hint.sin_family = AF_INET;
hint.sin_port = htons(_port);
hint.sin_addr.S_un.S_addr = INADDR_ANY;
bind(_ListenSocket, (sockaddr*)&hint, sizeof(hint));
// Tell Winsock the socket is for listening
listen(_ListenSocket, SOMAXCONN);
cout << "Listen socket ready\t\tsocket: " << _ListenSocket << endl;
}
...
void MCServer::Accept() {
_Client = accept(_ListenSocket, 0, 0); //<<<<<<<<<< PROBLEM
}
...
服务器.h
class MCServer {
...
private:
int _port;
char* _buf;
int _size = 4096;
SOCKET _ListenSocket;
SOCKET _Client;
fstream _file;
string _time;
string _skt;
...
当服务器启动时,_Client被设置为正确的值。例如 128 或 126 或 132。达到
_Client = accept(_ListenSocket, 0, 0);
老实说等待传入的连接。当客户敲门时,它就起作用了。然后,当该客户端完成时,服务器关闭套接字并再次调用
...
CreateListenSocket();
Accept();
...
但是第二次到达
_Client = accept(_ListenSocket, 0, 0);
_Client 被分配了一个宇宙数字......就像 99895919816189 和accept()在它应该等待真正的呼叫时接受没有传入客户端的连接。但是客户端还没有连接。怎么了?
发现了一个bug,想分享。希望它可以帮助某人。调试器发现问题:
看了MSDN,找到了解决办法,需要配置这个功能:
但问题并没有消失。bind()、listen() 和 accept() 可以正常工作。accept() 按预期等待,但在新的传入连接上不接受它。什么都没发生。我最终发现了一个错误:在这里,用我自己的方法:
将新套接字分配给客户端后,我没有关闭“侦听端口”。当再次调用该方法时
我正在尝试重新分配一个已经在监听的套接字,而没有正确关闭它。