套接字编程阻塞程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套接字编程阻塞程序相关的知识,希望对你有一定的参考价值。

我试图在python中使用UDP之间创建一个套接字。

代码非常简单

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.sendto(data_to_send, (host, port))
received_data = s.recvfrom(1024)

我的问题是,sendtorecvfrom阻止了方法吗?也就是说,当我调用sentdo时,我的代码将停止并等待recvfrom,因为,我正在四处游荡并在我的localhost上测试客户端和服务器模型,并手动注入3和4秒的随机睡眠时间来模拟真实生活延迟,以及如果延迟有点高,我会得到ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

答案

这些调用可能会阻止它们正在执行的线程。

如果操作系统内核的出站缓冲区已满,则sendto将阻塞,并且需要时间才能容纳您愿意发送的消息。 sendto不会阻止,因为远程应用程序尚未调用recvfrom

recvfrom将阻塞,直到从操作系统内核的入站缓冲区中读取内容。如果远程对等方没有发送任何内容或者消息尚未到达,recvfrom将阻止。

此外,您可能会发生一些错误配置。 ConnectionResetError可能会发生,因为某处有防火墙。延迟与问题无关,因为UDP没有连接和超时。

以上是关于套接字编程阻塞程序的主要内容,如果未能解决你的问题,请参考以下文章

c# SocketAsyncEventArgs 在 ReceiveAsync 处理程序中阻塞代码

在 C 编程中使用 libevent 编写非阻塞事件

Socket编程中,阻塞与非阻塞的区别

没有 while(true) 循环的 C# 非阻塞套接字

Linux编程之select

高性能网络IO模型