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