Linuxの靴下クライアントオフライン検出

--------------------- 
著者:GodQ 
出典:CSDN 
オリジナルます。https://blog.csdn.net/god2469/article/details/8801356 
免責事項:この記事ブロガー元の記事として、複製、ボーエンのリンクを添付してください!

 

切断されたもののリストに遠位端を決定するための以下の方法:

アクトワン:

場合RECVは()の値は、ソケット切断、0に等しい未満で返します。recv関数は、リターン信号を受信した後、プログラムとして記述、または通常のソケット接続、べきではない近くのソケット接続オフされた場合にEINTRのエラー番号、エラー番号== EINTRに等しいかどうかを決定することも必要です。

 

アクトII:

  情報構造体TCP_INFO; 
  int型のlen =はsizeof(情報); 
  はgetsockopt(私たちの靴下、IPPROTO_TCPを行く、TCP_INFO、&情報、(のsocklen_tは*)&LEN); 
  IF((== info.tcpi_state TCP_ESTABLISHED))、その後、切断は他の切断されていません

 

法III:

遠位端は、セレクトリターン1、RECV戻り0 OFFをオフ場合は、システム機能を使用すると、等を選択します。法律にその他の考慮事項。

 

第4幕:

//需要包含这两个文件
#include <netinet/tcp.h>
#include <netinet/ip.h>

int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

設定後は、使用中に、オフ時には、すぐにソケットを読んで、エラーを返します。失敗したETIMEDOUT

setsockopt用法:https://www.cnblogs.com/warren-liuquan/p/3557701.html

レイヤとオプションのペーパー操作が詳細に記載されています

 

アクトファイブ:

ハートビートパケットを受信しない独自のハートビートが一定時間内に切断されたカスタムとしてマークされて実現します。

公開された22元の記事 ウォンの賞賛9 ビュー8822

おすすめ

転載: blog.csdn.net/ljm_c_bok/article/details/88898700