2012-11-25 6 views
22

UDPソケットで100msのタイムアウトを設定しようとしています。私はC.を使用しています。私は以下のコードのrelavent部分を投稿しました。なぜこれがタイムアウトしていないのかわかりませんが、セグメントを受け取っていないときだけハングします。これはbind()メソッドを使用してバインドされていないソケットでのみ機能しますか?UDPソケットセットタイムアウト

#define TIMEOUT_MS  100  /* Seconds between retransmits */ 

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
    DieWithError("socket() failed"); 

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
    DieWithError("socket() failed"); 

//set timer for recv_socket 
static int timeout = TIMEOUT_MS; 
setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); 

if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0, 
     (struct sockaddr *) &servAddr2, &fromSize) < 0){ 
    //timeout reached 
    printf("Timout reached. Resending segment %d\n", seq_num); 
    num_timeouts++; 
} 
+2

エラーが返されたかどうかを確認するために 'setsockopt'の戻り値をチェックしていないようです。おそらくそうです。 'SO_RCVTIMEO'は、LinuxとMacOSの両方で' struct timeval'を取るこ​​とを文書化されていますが、あなたは 'int'を渡しています。代わりに 'struct timeval'を渡してみてください。また、なぜ '&timeout'を' char * 'にキャストしていますか? 'char * 'ではありません。 – Celada

答えて

40

SO_RCVTIMEOオプションが期待struct timevalsys/time.hで定義されている、あなたはそれを渡しているようではない整数。 timeval structには秒のフィールドとして、マイクロ秒のフィールドがあります。タイムアウトを100msに設定するには、次のようにします:

struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 100000; 
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) { 
    perror("Error"); 
}