我正在尝试编写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_SET
与FD_ISSET
一起使用。将套接字设置为非阻塞,再次调用recvfrom。总是得到同样的错误。
答案 0 :(得分:1)
“资源暂时不可用”对应于EAGAIN
。 man recvfrom
的错误部分说明EAGAIN
设置为:{/ p>
已设置接收超时,并且在收到数据之前超时已到期。
你的超时似乎太短了。
根据RFC 1541,客户端可以在发送初始消息之后不到4秒就重新发送发现消息。这意味着合理的超时应该在那个球场。