關於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都不能再接受對方傳輸的資料。實際...