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
Sockets UDP套接字提供错误WSAETIMEDOUT_Sockets_Udp_Winsock2 - Fatal编程技术网

Sockets UDP套接字提供错误WSAETIMEDOUT

Sockets UDP套接字提供错误WSAETIMEDOUT,sockets,udp,winsock2,Sockets,Udp,Winsock2,我对UDP套接字调用了sendto()。有时(并非总是)它会阻止我的应用程序约2.5秒。当我检查sendto()调用的返回值时,我得到SOCKET\u错误(-1)和WSAGetLastError()返回WSAETIMEDOUT(10060) 为什么UDP套接字会超时?在什么情况下,sendto()会成为阻塞调用 为什么UDP套接字会超时 如果套接字在阻塞模式(默认模式)下运行,并且为其分配了发送超时,则可能发生这种情况 在什么情况下sendto()会是阻塞调用 默认情况下,套接字是在阻塞模式下创

我对UDP套接字调用了
sendto()
。有时(并非总是)它会阻止我的应用程序约2.5秒。当我检查
sendto()
调用的返回值时,我得到
SOCKET\u错误(-1)
WSAGetLastError()
返回
WSAETIMEDOUT(10060)

为什么UDP套接字会超时?在什么情况下,
sendto()
会成为阻塞调用

为什么UDP套接字会超时

如果套接字在阻塞模式(默认模式)下运行,并且为其分配了发送超时,则可能发生这种情况

在什么情况下sendto()会是阻塞调用

默认情况下,套接字是在阻塞模式下创建的。如果需要,必须显式请求非阻塞行为

在阻塞模式下,如果内核缓冲区已满或WinSock在完成发送之前必须等待网络事件,UDP套接字可能会阻塞。这是记录在案的行为:

发出阻止Winsock调用(如sendto)时,Winsock可能需要等待网络事件,然后才能完成调用。Winsock在这种情况下执行可警报的等待,该等待可能会被安排在同一线程上的异步过程调用(APC)中断。在中断同一线程上正在进行的阻塞Winsock调用的APC内发出另一个阻塞Winsock调用将导致未定义的行为,Winsock客户端决不能尝试

如果传输系统中没有可用的缓冲空间来保存要传输的数据,sendto将阻塞,除非套接字已置于非阻塞模式。在非阻塞、面向流的套接字上,写入的字节数可以介于1和请求的长度之间,具体取决于客户端和服务器系统上的缓冲区可用性。select、WSAAsyncSelect或WSAEventSelect函数可用于确定何时可以发送更多数据


可能。也许我对套接字的工作原理有错误的想法,但由于udp不能保证消息将到达其目的地,什么超时会导致此阻塞?套接字是否正在等待接收端的ack?否。造成阻塞的最可能原因是网络拥塞。在代码中发送数据的速度比套接字传输数据的速度快,因此传出缓冲区会被填满并阻塞。