为UDP套接字的recv fcn设置超时 [英] setting timeout for recv fcn of a UDP socket
问题描述
我通过sendto
发送UDP数据包,然后通过recv
接收答案.如果recv
没有收到答复,则程序无法继续执行.但是,udp数据包可能会丢失,或者由于某些原因可能无法传送该数据包,从而使程序卡在recv
行上.我想知道如果nopacket到达,例如一分钟,然后跳过该行并继续执行代码,怎么可能为recv
设置超时?
I send a UDP packet by sendto
, then receive the answer by recv
.if recv
does not receive the reply, the program does not proceed. However, the udp packet might be lost, or for some reason, the packet may not be delivered, so that the program gets stuck on recv
line. I wonder how is it possible to set a timeout for recv
if nopacket arrives in ,e.g., a minute, then skip that line and proceed the code?
我没有粘贴完整的代码,因为它是通用的udp
代码,而我的问题与唯一的recv
有关.最后一点,开发环境是linux.
I am not pasting the full code since it is a generic udp
code and my question is related to the only recv
. For the final note, the development environment is linux.
unsigned long buf[maxlen];
struct protoent *proto; //
struct sockaddr_in server_addr;
int s; // socket
memset( &server_addr, 0, sizeof( server_addr ));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr = inet_addr(hostname);
sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
recv(s,buf,sizeof(buf),0);
推荐答案
您可以使用poll
或select
或类似的方法:
You can use poll
or select
or something similar:
struct pollfd fd;
int res;
fd.fd = s;
fd.events = POLLIN;
res = poll(&fd, 1, 1000); // 1000 ms timeout
if (res == 0)
{
// timeout
}
else if (res == -1)
{
// error
}
else
{
// implies (fd.revents & POLLIN) != 0
recv(s,buf,sizeof(buf),0); // we can read ...
}
这篇关于为UDP套接字的recv fcn设置超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!