---------------------
著者: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
レイヤとオプションのペーパー操作が詳細に記載されています
アクトファイブ:
ハートビートパケットを受信しない独自のハートビートが一定時間内に切断されたカスタムとしてマークされて実現します。