2013-05-10 102 views
2

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

+0

是否可能调用WSACleanup某处,如在析构函数中? – 2013-05-10 07:32:34

回答

4

10093是WSANOTINITIALISED,这意味着WSACleanup()已被调用的次数多于已调用WSAStartup()的次数。

根据您提供的代码,看起来Socket::Accept()正在返回Socket而不是Socket*。如果是这样,那么Accept()正在创建临时Socket,在Socket *socket被分配后立即超出范围。有可能Socket析构函数不应该调用WSACleanup()。电话WSAStartup()WSACleanup()必须始终保持平衡。

+0

谢谢!这解决了我的问题! – UnTraDe 2013-05-10 09:42:08

4

我在编写跨平台套接字应用程序时遇到了完全相同的问题。它在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 
+2

谢谢 - 这是我遇到的问题 - 我没有在if/else的所有分支中执行WSAStartup() – WonderfulDay 2017-04-17 19:04:12