簡體   English   中英

C++ Winsock 10093 錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM