C++ Winsock 10093错误
我想在C++中构建一个可以接受多个客户端的服务器。为此,我构建了一个winsock包装器,并使用线程和boost来为每个客户进行通信。
我试图接受客户端时遇到了一个奇怪的问题,我有一个看起来像这样的循环。C++ Winsock 10093错误
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,这意味着编写接受()在循环停止阻塞,并由于某种原因不会正确接受。我在网上读到这个错误是由于没有调用WSAStartup()而引起的,但是我在套接字的构造函数中调用了它,并且它在第一次接受了。
10093是WSANOTINITIALISED
,这意味着WSACleanup()
已被调用的次数多于已调用WSAStartup()
的次数。
根据您提供的代码,看起来Socket::Accept()
正在返回Socket
而不是Socket*
。如果是这样,那么Accept()
正在创建临时Socket
,在Socket *socket
被分配后立即超出范围。有可能Socket
析构函数不应该调用WSACleanup()
。电话WSAStartup()
和WSACleanup()
必须始终保持平衡。
谢谢!这解决了我的问题! – UnTraDe 2013-05-10 09:42:08
我在编写跨平台套接字应用程序时遇到了完全相同的问题。它在linux和OS X上工作正常,但我在Windows上得到了这个错误10093。要修复它在调用任何winsock函数之前添加此代码:
#ifdef WIN32
// Initialize Winsock
int iResult;
WSADATA wsaData;
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
std::cout << "WSAStartup failed: " << iResult << std::endl;
return;
}
#endif
谢谢 - 这是我遇到的问题 - 我没有在if/else的所有分支中执行WSAStartup() – WonderfulDay 2017-04-17 19:04:12
是否可能调用WSACleanup某处,如在析构函数中? – 2013-05-10 07:32:34