我正在尝试用 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() 引起的,但我确实在套接字的构造函数中调用了它,并且它确实在第一次接受了。