Sockets UDP套接字提供错误WSAETIMEDOUT
我对UDP套接字调用了Sockets UDP套接字提供错误WSAETIMEDOUT,sockets,udp,winsock2,Sockets,Udp,Winsock2,我对UDP套接字调用了sendto()。有时(并非总是)它会阻止我的应用程序约2.5秒。当我检查sendto()调用的返回值时,我得到SOCKET\u错误(-1)和WSAGetLastError()返回WSAETIMEDOUT(10060) 为什么UDP套接字会超时?在什么情况下,sendto()会成为阻塞调用 为什么UDP套接字会超时 如果套接字在阻塞模式(默认模式)下运行,并且为其分配了发送超时,则可能发生这种情况 在什么情况下sendto()会是阻塞调用 默认情况下,套接字是在阻塞模式下创
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?否。造成阻塞的最可能原因是网络拥塞。在代码中发送数据的速度比套接字传输数据的速度快,因此传出缓冲区会被填满并阻塞。