2013-05-10 111 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