Posted on 2009-02-03 11:01
Prayer 閱讀(4945)
評論(0) 編輯 收藏 引用 所屬分類:
SOCKET
/* 判定斷開前的KeepAlive探測次數(shù) */
因此我們可以得到
int keepIdle = 6;
int keepInterval = 5;
int keepCount = 3;
Setsockopt(listenfd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));
Setsockopt(listenfd, SOL_TCP,TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
Setsockopt(listenfd,SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
我們需要注意的TCP-Keepalive-HOWTO上這段話:
Remember that keepalive is not program−related, but socket−related, so if you have multiple sockets, you can handle keepalive for each of them separately.
這些屬性是sockt繼承的,非整個代碼內(nèi)的所有sockets都繼承這個屬性,因為如果要應(yīng)用到多個套接口上必須分別使用Setsockopt, Setsockopt是setsockopt的包裹函數(shù)。
如果心搏函數(shù)要維護客戶端的存活,即服務(wù)器必須每隔一段時間必須向客戶段發(fā)送一定的數(shù)據(jù),那么使用SO_KEEPALIVE是有很大的不足的。因為 SO_KEEPALIVE選項指"此套接口的任一方向都沒有數(shù)據(jù)交換",我不知道大家是怎么理解這個實現(xiàn)的。在Linux 2.6系列上,上面話的理解是只要打開SO_KEEPALIVE選項的套接口端檢測到數(shù)據(jù)發(fā)送或者數(shù)據(jù)接受就認為是數(shù)據(jù)交換。
因此在這種情況下使用 SO_KEEPALIVE選項 檢測對方是否非正常連接是完全沒有作用的,在每隔一段時間發(fā)包的情況, keep-alive的包是不可能被發(fā)送的。上層程序在非正常端開的情況下是可以正常發(fā)送包到緩沖區(qū)的。非正常端開的情況是指服務(wù)器沒有收到"FIN" 或者 "RST"包。
當(dāng)然這種情況也是比較好斷定對方是否存活,我提出來的主要原因是想看看大家對"此套接口的任一方向都沒有數(shù)據(jù)交換"是怎么去理解的。
本文來自: (www.91linux.com) 詳細出處參考:http://www.91linux.com/html/article/program/cpp/20081222/14912_2.html