簡體   English   中英

C++ WinSock:如何知道接收器是否斷開連接

[英]C++ WinSock: How to know if receiver disconnected

我有兩個程序。 它們通過本地主機 TCP 連接,並在同一台機器上運行。 首先是通過 send() 發送消息,其次是通過 recv() 接收消息。 當第二個程序終止時(我只是停止運行它),它不會調用析構函數來關閉套接字,並且套接字保持打開狀態。 同時程序 1 正在嘗試發送消息,並且沒有收到錯誤(重新連接),因為消息實際上是在套接字中寫入的。 如何知道程序 2 是否斷開連接?

如果程序 2 終止,send() 不會返回 -1。 我試過使用 WSAPOLLFD

    WSAPOLLFD pollfds[1];
    pollfds[0].fd = sockfd;
    pollfds[0].events = POLLOUT | POLLHUP | POLLERR; // Interested in write events, hang-up events, and error events

    int ready = WSAPoll(pollfds, 1, INFINITE); // Wait indefinitely until an event occurs
    if (ready == -1)
    {
        int error = WSAGetLastError();
        std::cout << "Error polling response! Error code: " << error << std::endl;
        isConnected = false;
    }

並最終每次都收到錯誤代碼:10022

讓我們舉個例子,就像你對你的服務器進行編程,它向每個連接它的客戶端發送“hello world”消息,如果客戶端在連接后立即斷開連接,我們的服務器仍然會嘗試發送“hello world”消息。

注意:在 winsock API 中沒有這種適當的方式來告訴客戶端已斷開連接。

所以,我們能做的是:-

int iResult;

iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
        wprintf(L"send failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
}

所以,基本上我們使用的邏輯是,如果 function 出現錯誤,那么我們將假設客戶端已斷開連接,對於更高級的服務器,您可以使用函數查看斷開連接的客戶端的 IP 地址和更高級的 winsock API 函數。

如果您想實時執行此操作,則可以循環發送數據包並運行檢查。

我希望答案有所幫助::)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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