簡體   English   中英

如何檢查客戶端是否通過C ++中的Winsock斷開連接?

[英]How can I check if a client disconnected through Winsock in C++?

如何檢查客戶端是否通過C ++中的Winsock斷開連接?

Beej的網絡編程指南

如果你在阻塞模式下調用recv並且它返回0字節讀取,則套接字已斷開連接,否則它等待接收字節。

請看這個FAQ 2.12

示例來自頁面上的選擇。

int nRet;

if(( nRet = select( 0, &fdread, NULL, NULL, NULL )) == SOCKET_ERROR )
{
    // Error condition
    // Check WSAGetLastError
}

if( nRet > 0 )
{
    // select() will return value 1 because i m using only one socket
    // At this point, it should be checked whether the
    // socket is part of a set.

    if( FD_ISSET( s, &fdread ))
    {
        // A read event has occurred on socket s
    }
}

您只能通過嘗試發送數據來判斷TCP套接字是否“已斷開連接”。 這是因為協議的設計應該允許在對等體之間暫時中斷。 因此,如果您從A通過R1經過R2連接到B並發送數據一段時間然后停止發送,您可以拔掉R2-> R3(例如),A和B都不會注意到(或小心)。 如果您然后插入R2-> R4和R4-> R3,然后嘗試在A和B之間發送數據,那么事情就會“正常工作”而您永遠不會知道。 但是,如果您在R2-> R3斷開連接時嘗試發送數據,那么您(最終在所有TCP級別重試之后)會收到錯誤。

現在,某些操作系統可能會提醒您當前網絡適配器當前未連接的事實,您可以使用它來說“我不再與我的同行連接”,但我不建議。

如果讓對等方知道什么時候連接被“斷開”很重要,那么要么使用應用程序級別的“ping”消息來偶爾在對等體之間發送數據,要么使用TCP keep-alive。 就個人而言,我會去ping消息......

編輯:當然所有這一切都假設您想知道您是否仍然可以在連接上發送數據,畢竟,當客戶端不再發送時,您已經完成了因為您的讀取將返回0字節並且您知道何時斷開連接它的發送方是因為你的寫入會失敗; 你也知道什么時候關閉你自己的連接端的發送或接收端...

我想我應該堅持使用“define disconnected”的初始腸道反應響應;)

有幾種不同的方法,但最常見的是檢查發送或接收命令的結果:

 nReadBytes = recv(sd, ReadBuffer, BufferSize, 0);
 if (nReadBytes == SOCKET_ERROR)
 {
     //error
 }
 nSendBytes = send(sd, WriteBuffer, BufferSize, 0);
 if (nSendBytes == SOCKET_ERROR)
 {
     //error
 }

更多示例(完成錯誤檢查,包括客戶端和服務器):

http://tangentsoft.net/wskfaq/examples/basics/

如果send()或recv()的結果是SOCKET_ERROR並且WSAGetLastError()返回WSAECONNRESET,則客戶端已斷開連接。
來自MSDN:

WSAECONNRESET

連接由同行重置。

遠程主機強制關閉現有連接。 如果遠程主機上的對等應用程序突然停止,主機重新啟動,主機或遠程網絡接口被禁用,或者遠程主機使用硬關閉,則通常會產生這種情況(有關遠程主機上SO_LINGER選項的更多信息,請參閱setsockopt)插座)。 如果由於保持活動活動在一個或多個操作正在進行時檢測到故障而導致連接中斷,則也可能導致此錯誤。 正在進行的操作因WSAENETRESET而失敗。 后續操作因WSAECONNRESET而失敗。

這也適用於非阻塞套接字。

int r = recv(sock, NULL, 0, 0);
if(r == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET){
    //client has disconnected!
}

暫無
暫無

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

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