2012-05-11 5 views
0

どのように読み取りと書き込み(ソケット)でタイムアウトを設定しますか?それをテストしますか?ハンドラソケットタイマーを読み書きする場合

struct timeval timeout; 
timeout.tv_sec = 3; 
timeout.tv_usec = 0; 
setsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, 
    sizeof(timeout)); 
setsockopt (fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, 
    sizeof(timeout)); 
string temp; 
while (1) { 
    char buf [20]; 
    ssize_t e = read(fd, buf, 20); 
      // convert current buf into string 
      // add current string to temp 
      // check if end of temp == \r\n\r\n 
      // if yes break 
} 

だから私は、Telnetを使用している場合はこれをテストするために、リードがブロックされているため、「こんにちは」、コンソール「ハング」と入力します。しかし、3秒を過ぎるとタイムアウトは何もしません。 3秒間吊り下げた後、読み取りを行って接続を終了します。これはどうすればいいですか?

+0

'read()'は接続を閉じることができません。読み込みにエラーまたは '0'が返されたかどうかを確認してから、' close(fd) 'を使って接続を閉じなければなりません。 – dwalter

答えて

0

サイズは明らかに間違っている:

setsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, 
    sizeof(timeout) < 0); 

ドロップ< 0。あなたはおそらくいくつかからペーストされたコピーし、その後、かっこにぶつかった。

+0

k編集thx – Derek

関連する問題