UDP recvfrom 不成功

UDP recvfrom not successful

我正在尝试编写 DHCP 客户端,但由于 recvfrom() 上的 "Resource temporarily unavailable" 而未能收到 DHCP Offer。我这样设置套接字(省略了 return 值的检查):

    int sct = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    return sct;
    /* set option for socket to broadcast */
    int opt_val = 1;    
    int res = setsockopt(sct, SOL_SOCKET, SO_REUSEADDR, (char *)&opt_val, sizeof(opt_val));    
    res = setsockopt(sct, SOL_SOCKET, SO_BROADCAST, (char *)&opt_val, sizeof(opt_val));

然后我将套接字绑定到接口,然后实际绑定自己。一切顺利。然后我成功地发送了 DHCP Discover,但我没能捕捉到 DHCP Offer。显示在 WIreshark 中。像这样接收数据包:

struct sockaddr_in srcInfo;
struct timeval t_out;
t_out.tv_usec = timeout * 10000; // 50 ms timeout
t_out.tv_sec = 0;
socklen_t sockSize = sizeof(srcInfo);
int setSc = setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&t_out, sizeof(struct timeval));
ssize_t res = recvfrom(socket, (void*)buffer, sizeof(DHCP_hdr), 0, (struct sockaddr *)&srcInfo, &sockSize);

res var始终为-1,错误如上。我已经尝试了 SO 上的所有内容 - 没有成功。使用 FD_SETFD_ISSET。将套接字设置为非阻塞,然后再次调用 recvfrom。总是得到同样的错误。

“资源暂时不可用”对应EAGAINman recvfrom 的错误部分表示 EAGAIN 设置为:

a receive timeout had been set, and the timeout expired before data were received.

您的超时似乎太短了。

根据 RFC 1541,客户端可以在发送初始消息后的 4 秒内重新发送发现消息。这意味着合理的超时应该在那个范围内。