關於socket判斷連線斷開並重連

2021-09-30 05:22:02 字數 1610 閱讀 3516

關於socket判斷連線斷開並重連 以下是個執行緒函式 uint cmonitordlg::threadfunction(lpvoid pparam) if(connect(s,(struct sockaddr*)&serv1,sizeof(serv1))==invalid_socket) else else if(ilen==socket_error) ...... .....省略** }while//do-while } //else closesocket(s); //關閉套接字 wsacleanup(); return 0; } 因為這個執行緒建立以後一直在執行,裡面的迴圈體不停地從套接字中取資料並處理資料,但要是我所連線的服務端斷開了我如何判斷,並自動重新連線(而不用關程式重新開)。請高手在我**基礎上新增所需修改的地方,謝謝。

你現在用的是阻塞模式的套接字。recv返回有幾種情況,一種是收到資料返回,這時的返回值是》0的;一種是對方呼叫了close,這時recv會立即返回0;還有一種是返回-1(socket_error),這是由於網路出現了某種故障。如果出現網路故障,比如網路斷了或者你拔了網線,大多數情況下recv不會立即返回,而是要等到套接字超時才返回-1(超時時間長度與具體系統有關,一般要幾分鐘)。

針對你的**,要實現重連最簡單的改進就是在函式裡加乙個迴圈,把你現在函式中全部**放到這個迴圈內。

由於當網路出現故障時,recv要很長時間才能返回,如果你覺得這種方式不能接受,可以考慮select或者其他模型。

uint cmonitordlg::threadfunction(lpvoid pparam)

socket          s;            //建立套接字

int              port=port;

int              ilen;                //從伺服器接收的資料長度  

tchar            recvbuf[bufferlen];  //接受資料的緩衝器

struct sockaddr_in serv1;            //伺服器端位址

serv1.sin_family=af_inet; //需要連線的伺服器位址資訊  

serv1.sin_port=htons(port);  //需要連線的伺服器位址資訊

serv1.sin_addr.s_addr=inet_addr(p->ip);  //將命令列的ip位址轉化為二進位制表示的網路位元組順序ip位址

s=socket(af_inet,sock_stream,0);  

if(s==invalid_socket)

if(connect(s,(struct sockaddr*)&serv1,sizeof(serv1))==invalid_socket)  

else    

else if(ilen==socket_error) // 網路錯誤

......

.....省略**

}while//do-while

} //else

closesocket(s); //關閉套接字

} // end of while(1)

wsacleanup();

return 0;

} 這麼詳細了,再不明白就不對了

如何判斷socket已經斷開

最近在做乙個伺服器端程式,c s結構。功能方面比較簡單就是client端與server端建立連線,然後傳送訊息給server。我在server端 會使用專門的執行緒處理一條socket連線。這就涉及到乙個問題,如果socket連線斷開 異常,正常 後,我如何才能感知到?server端這邊是絕 對被動...

如何判斷Socket是否斷開

socket在連線以後,如果客戶端非正常退出,比如網線掉了 超時退出等,伺服器端的socket仍然有快取,此時可以從該socket描述符中讀出一些資料,短時間內甚至可以寫,因此判斷tcp socket是否斷開及其不易,網上有很多方法,都不能精確判斷。本人用select和recv寫了乙個,在緩衝區被讀...

socket程式設計 優雅的斷開連線shutdown

呼叫 close closesocket 函式意味著完全斷開連線,即不能傳送資料也不能接收資料,這種 生硬 的方式有時候會顯得不太 優雅 上圖演示了兩台正在進行雙向通訊的主機。主機a傳送完資料後,單方面呼叫 close closesocket 斷開連線,之後主機a b都不能再接受對方傳輸的資料。實際...