我通过 sendto 发送一个 UDP 数据包,然后通过 recv 接收答案。如果 recv 没有收到回复,则程序不会继续。但是,udp 数据包可能会丢失,或者由于某些原因,数据包可能无法传递,从而导致程序卡在 recv 行。我想知道如果 nopacket 到达,例如一分钟,如何为 recv 设置超时,然后跳过该行并继续执行代码?

我没有粘贴完整的代码,因为它是一个通用的 udp 代码,我的问题与唯一的 recv 相关。最后要注意的是,开发环境是 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);

最佳答案

您可以使用 pollselect 或类似的东西:

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 ...
}

关于c - 为 UDP 套接字的 recv fcn 设置超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16163260/

10-15 18:04