ホームページ  >  記事  >  バックエンド開発  >  golangでtcpが切断されているかどうかを確認する方法

golangでtcpが切断されているかどうかを確認する方法

尚
オリジナル
2019-12-17 10:48:105991ブラウズ

golangでtcpが切断されているかどうかを確認する方法

TCP が切断されているかどうかを判断する Golang のメソッド:

キープアライブ検出キープアライブ設定の場合、ピア ソケットが利用できなくなったことを TCP が検出したとき (メッセージを送信できません)検出パケット、または検出パケットが ACK 応答パケットを受信しない場合)、select はソケットが読み取り可能であることを返し、recv 中に -1 を返し、errno を ETIMEDOUT に設定します。このとき、TCP の状態は切断状態になります。

struct TCP_KEEPALIVE {  
    unsigned long onoff;  
    unsigned long keepalivetime;  
    unsigned long keepaliveinterval;  
} ;  
  
#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)  
  
/* KeepAlive实现 */  
void set_keepalive (SOCKET s)  
{  
    BOOL bKeepAlive = TRUE;  
    int nRet = ::setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));  
    if (nRet == SOCKET_ERROR)  
    {  
        return ;  
    }  
    /* 输入参数 */  
    struct TCP_KEEPALIVE inKeepAlive = {0};   
    unsigned long ulInLen = sizeof(struct TCP_KEEPALIVE);  
  
    /* 输出参数 */  
    struct TCP_KEEPALIVE outKeepAlive = {0};   
    unsigned long ulOutLen = sizeof(struct TCP_KEEPALIVE);  
    unsigned long ulBytesReturn = 0;  
    int ret = 0;  
  
    /* 设置keepalive 为5秒,并且发送次数为3次 */  
    inKeepAlive.onoff             = 1;  
    /* 2次keepalive探测间隔时间 */  
    inKeepAlive.keepaliveinterval = 5000;   
    /* 开始首次keepalive探测前的tcp空闲时间 */  
    inKeepAlive.keepalivetime     = 5000;   
  
    ret = WSAIoctl((unsigned int)s,  
            SIO_KEEPALIVE_VALS,  
            (LPVOID)&inKeepAlive,   
            ulInLen,  
            (LPVOID)&outKeepAlive,   
            ulOutLen,  
            &ulBytesReturn,   
            NULL,   
            NULL);  
    if (ret == SOCKET_ERROR)  
    {  
        printf ("error: %d\n", WSAGetLastError());  
    }  
}

golang の知識について詳しくは、golang チュートリアル 列に注目してください。

以上がgolangでtcpが切断されているかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。