我正在尝试用 C++ 构建一个可以接受多个客户端的服务器。为此,我构建了一个 winsock 包装器,并使用带有 boost 的线程来为每个客户端进行通信。
我在尝试接受客户时遇到了一个奇怪的问题,我有一个看起来像这样的循环。
int clientID = 0;
listenSocket = new Socket(SocketType::TCP);
listenSocket->Bind(port);
listenSocket->Listen();
while(running)
{
Socket *socket = &listenSocket->Accept();
mutex.lock();
clients.push_back(new Client(socket, clientID));
mutex.unlock();
std::cout << "Client with id " << clientID << " connected!" << std::endl;
std::cout << WSAGetLastError() << std::endl;
clientID++;
}
现在,第一个客户端接受良好并且 WSAGetLastError() 返回 0,但是在第一个连接之后,即使我不尝试连接另一个它也只是继续在控制台 10093 中写入,这意味着循环中的 Accept() 停止阻塞并且由于某种原因不会正确接受。我在网上读到这个错误是由于没有调用 WSAStartup() 引起的,但我确实在套接字的构造函数中调用了它,并且它确实在第一次接受了。
10093 是WSANOTINITIALISED
,这意味着:
根据您提供的代码,看来Socket::Accept()
正在返回一个Socket
按值而不是对象Socket*
指针。如果是这样,那么Accept()
正在创建一个临时的Socket
之后立即超出范围Socket *socket
被安排了。有可能的是Socket
析构函数正在调用WSACleanup()
当它不应该的时候。致电WSAStartup()
and WSACleanup()
必须始终保持平衡。
打电话的最佳时间WSAStartup()
是在程序启动期间,而不是在对象的构造函数内。同样,打电话的最佳时间WSACleanup()
是在退出前的程序清理期间,而不是在对象的析构函数内。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)