我正在使用该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;
}
}
超时(例如您正在实施的)不是延迟语句。相反,它是一种防止诸如recv()
、 或recvfrom()
无限期阻塞之类的调用的方法。如果数据流量比设置的超时时间更早出现,那就更好了。函数接收它,程序流程继续。超时,正如你所拥有的,最多等待 2 秒才能发生某些事情。如果什么都没有发生,那么它允许该方法停止等待,并让您的程序继续执行,即它不会阻塞。在没有超时的情况下,函数类似于recv()
, orrecvfrom()
可以永远阻塞。
如果您想在对and 的调用之间强制间隔 2 秒(或阻止),请放置sleep(2); ( 或者如果在 Windows 上,Sleep(2000); ) 语句在循环中的某处,可能在底部。recvfrom()
sendto()
while(1){
...
}
sleep(2); //or on Windows, Sleep(2000);
}
顺便说一句,习惯性地检查任何具有返回值的函数的返回值也是一个好主意,特别是如果该函数的失败会对您的其余代码造成严重破坏。例如:
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)) < 0) {
perror("Error");
}
...
一些主题相关的旁白:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句