Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UDP recvfrom未成功_C_Sockets_Udp_Dhcp - Fatal编程技术网

UDP recvfrom未成功

UDP recvfrom未成功,c,sockets,udp,dhcp,C,Sockets,Udp,Dhcp,我正在尝试编写DHCP客户端,但由于recvfrom()上的“资源暂时不可用”,无法接收DHCP提供。我这样设置套接字(不检查返回值): 然后我将套接字绑定到接口,然后实际绑定自身。一切都成功了。然后我成功地发送了DHCP Discover,但没有收到DHCP的报价。出现在WIreshark。这样接收数据包: struct sockaddr_in srcInfo; struct timeval t_out; t_out.tv_usec = timeout * 10000; // 50 ms ti

我正在尝试编写DHCP客户端,但由于recvfrom()上的“资源暂时不可用”,无法接收DHCP提供。我这样设置套接字(不检查返回值):

然后我将套接字绑定到接口,然后实际绑定自身。一切都成功了。然后我成功地发送了DHCP Discover,但没有收到DHCP的报价。出现在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变量始终为-1,错误如上所述。我已经尝试了这里的一切,所以-没有成功。使用
FD\u集
FD\u集
。将套接字设置为非阻塞,然后再次调用recvfrom。总是出现相同的错误。

“资源暂时不可用”对应于
EAGAIN
man recvfrom
的Errors部分指出,如果出现以下情况,则设置
EAGAIN

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

你的超时时间似乎太短了


根据本发明,客户端可以在发送初始消息之后不早于4秒重新发送发现消息。这意味着一个合理的超时应该在这个范围内。

根据平台的不同,套接字函数返回错误后,通常会有另一个全局变量值,如
err
errno
,或者调用一个函数,如
WSAGetLastError()
,该函数具有特定的错误代码。
sizeof(DHCP\u hdr)
这个足够放一个完整的回复包吗?@wildplasser是的,正好590bytes@DanKorn是的,“资源暂时不可用”是不成功的
recvfrom()之后的
errno
的一种可编辑形式。
errno的值是多少?我的意思是EAGAIN、EBADF、EINTR等…超时时间足够了,因为根据wireshark,报价在25毫秒内发送。我确实提高了暂停时间,但是没有help@Coolman你所犯的错误与你不符。您正在与错误本身争论。最后,它抛出错误的原因是其他应用程序已经捕获了所有响应。
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);