UDP recvfrom not successful

时间:2018-03-07 18:10:33

标签: c sockets udp dhcp

我正在尝试编写DHCP客户端,但由于recvfrom()上的“资源暂时不可用”而未能收到DHCP优惠。我像这样设置我的套接字(省略检查返回值):

    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,错误如上所示。我已经尝试了所有在这里的东西 - 没有成功。将FD_SETFD_ISSET一起使用。将套接字设置为非阻塞,再次调用recvfrom。总是得到同样的错误。

1 个答案:

答案 0 :(得分:1)

“资源暂时不可用”对应于EAGAINman recvfrom的错误部分说明EAGAIN设置为:{/ p>

  

已设置接收超时,并且在收到数据之前超时已到期。

你的超时似乎太短了。

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