2

connect()Win32 環境でソケット呼び出しのタイムアウトを「調整」する方法はありますか? 具体的には、タイムアウトの長さを増やしたいと考えています。使用中のソケットはノンブロッキングです。ありがとう!

4

3 に答える 3

2

はい、可能です。

の後に非ブロッキング モードになっているconnect()場合は、通常、select()I/O の準備が整うまで待機します。この関数には、タイムアウト値を指定するためのパラメーターがあり、タイムアウトの場合は 0 を返します。

于 2008-11-13T11:01:11.913 に答える
0

いいえ、これは不可能です。デフォルトの接続タイムアウトは減らすことができますが、増やすことはできません。

于 2013-10-09T00:25:29.350 に答える
0

SO_RCVTIMEO および SO_SNDTIMEO ソケット オプションを使用して、ソケット操作のタイムアウトを設定できます。例:

struct timeval timeout;      
timeout.tv_sec = 10;
timeout.tv_usec = 0;

if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
            sizeof(timeout)) < 0)
    error("setsockopt failed\n");

if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,
            sizeof(timeout)) < 0)
    error("setsockopt failed\n");

alarm() を試すこともできます。サンプル:

signal( SIGALRM, connect_alarm ); /* connect_alarm is you signal handler */
alarm( secs ); /* secs is your timeout in seconds */
if ( connect( fd, addr, addrlen ) < 0 )
{
    if ( errno == EINTR ) /* timeout, do something below */
        ...
}
alarm( 0 ); /* cancel the alarm */
于 2012-03-26T06:33:21.863 に答える