40

UDP ソケットに 100 ミリ秒のタイムアウトを設定しようとしています。私はCを使用しています.以下のコードの関連部分を投稿しました. これがタイムアウトしない理由はわかりませんが、セグメントを受信しないとハングします。これは bind() メソッドを使用してバインドされていないソケットでのみ機能しますか?

#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++;
}
4

2 に答える 2

65

このオプションは、渡される整数ではなく、で定義されていることをSO_RCVTIMEO想定しています。には、秒のフィールドとマイクロ秒のフィールドがあります。タイムアウトを100msに設定するには、次の方法でうまくいくはずです。struct timevalsys/time.htimeval struct

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");
}
于 2012-11-25T02:55:25.270 に答える