我正在使用setsockopt()
函数在recvfrom()
函数上设置超时。由于我使用的协议,我必须首先具有2秒的超时时间,然后是4、6,直到最大时间。但是当我使用该功能时,它似乎有0.01秒的超时时间,因为它发送了8个数据包而没有等待。
//more variables and code here
struct timeval timeout = {2,0};
while(1){
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval));
temp2 = recvfrom(sock, &buff, sizeof(buff), 0, (struct sockaddr *)&addr_server, sizeof(addr_server));
if(temp2 < 0){ /* Timeout excedit (exceeded)*/
temp = sendto(sock, (struct udp_PDU*)®_pdu, sizeof(reg_pdu), 0, (struct sockaddr *)&addr_server, sizeof(addr_server));
if(temp == -1){
printf("Error sendTo \n");
exit(-1);
}
packet_counter++;
debug("Enviat paquet REGISTER_REQ");
if(packet_counter == 8) break;
if((interval * max) > t ) timeout.tv_sec+=interval;
}else{ /* s'han rebut dades (they have rebooted) */
correct = 1;
break;
}
}
答案 0 :(得分:6)
超时(例如您要实现的超时)不是延迟语句。相反,它是一种防止诸如recv()
或recvfrom()
之类的呼叫无限期阻塞的方法。如果数据流量的显示时间早于设置的超时时间,那么情况会更好。该函数接收它,然后程序流程继续。超时,您需要等待2秒钟才能发生。如果什么也没发生,那么它允许该方法停止等待,并让您的程序继续执行,即不会阻塞。如果没有超时,则recv()
或recvfrom()
之类的函数可能会永远阻塞。
如果您想在两次调用recvfrom()
和sendto()
的时间之间强制间隔2秒(或 block ),请放置 sleep(2); (或者在Windows中为 Sleep(2000); )语句,可能在循环中的某个位置,可能在底部。
while(1){
...
}
sleep(2); //or on Windows, Sleep(2000);
}
顺便说一句,习惯性地检查具有一个函数的任何函数的返回值也是一个好主意,尤其是如果该函数的失败会严重破坏代码的其余部分。例如:
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)) < 0) {
perror("Error");
}
...
与主题相关的一些辅助信息: