Posted on 2008-12-11 19:58
Prayer 閱讀(2450)
評論(0) 編輯 收藏 引用 所屬分類:
SOCKET
我寫了一個socket的客戶端和服務(wù)器端,請問服務(wù)器端如何判斷客戶端已經(jīng)斷開連接了
如果客戶端結(jié)束進(jìn)程,會發(fā)出FIN,但是如果是網(wǎng)線撥了,服務(wù)器就不知道了。借樓主的貼討論一下:
1.如果撥掉網(wǎng)線的時候服務(wù)哭正在阻塞讀,且沒有設(shè)置超時選項,它會阻塞多久才能知道不可達(dá)?
2.如果。。。。。。。。。。正在阻塞寫,。。。。。。。。。。。。。。。。。。。。。。。?
(也沒有設(shè)置KEEP_ALIVE)
我用心跳機(jī)制來防止拔網(wǎng)線這中情況
client每間隔M秒發(fā)一個心跳包給server
若連續(xù)N秒server端沒有收到client的心跳包,則認(rèn)為client已經(jīng)去見馬克思了
一般應(yīng)該這樣:
1、心跳。
2、非阻塞方式。阻塞方式是不方便判斷諸如:網(wǎng)線斷開這樣的異常情況的。說“不方便”,就因為還是依賴于程序的實現(xiàn)是怎么樣的。
原帖由
linuxxinetd 于 2007-8-21 20:22 發(fā)表

進(jìn)程是這樣可以的。但我用的是線程,客戶端和服務(wù)器端都有兩個收發(fā)線程,客戶端發(fā)送線程退出,服務(wù)器的收線程怎么知道???
服務(wù)器的收線程的 recv函數(shù)會返回0