[英]C++ Winsock 10093 error
我正在嘗試用 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
,這意味着根本沒有調用WSAStartup()
,或者調用WSACleanup()
次數比調用WSAStartup()
次數多。
根據您提供的代碼,似乎Socket::Accept()
正在返回Socket
而不是Socket*
。 如果是這樣,則Accept()
正在創建一個臨時Socket
,該Socket *socket
在分配Socket *socket
后立即超出范圍。 Socket
析構函數可能在不應該調用WSACleanup()
時候調用它。 對WSAStartup()
和WSACleanup()
調用必須始終保持平衡。
在編寫跨平台套接字應用程序時,我遇到了完全相同的問題。 它在 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.