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