8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

python 套接字 recv 超时,而 Wireshark 显示已收到 UDP 数据包(windows)

ayeh 2月前

42 0

我有以下图表:发送:客户端--(tx_socket)-->服务器回复:服务器--(rx_socket)-->客户端def connect(self)->无:self.tx_socket = socket.socket(socket.AF_INET,

我有下图:

发送: 客户端 --(tx_socket)--> 服务器

回复: 服务器 --(rx_socket)--> 客户端

def connect(self) -> None:
    self.tx_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.tx_socket.bind(("", self.tx_src_port))

    self.rx_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.rx_socket.settimeout(3.0)
    self.rx_socket.bind(("", self.rx_dst_port))

但是,在等待服务器回复时总是会出现超时错误,即使 Wireshark 显示回复数据包:

self.tx_socket.sendto(command_str, (self.dst_addr, self.tx_dst_port))
self.rx_socket.recv(4096) # <--- TimeoutError

不知何故,可以通过预先使用 rx_socket 从客户端向服务器发送一个字符来解决此问题:

self.rx_socket.sendto("\n".encode('ascii'), (self.dst_addr, self.tx_dst_port))

但我不明白为什么会发生这种情况。此外,Linux 中不存在同样的问题。

你能给我解释一下吗?任何回复都非常感谢。

帖子版权声明 1、本帖标题:python 套接字 recv 超时,而 Wireshark 显示已收到 UDP 数据包(windows)
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由ayeh在本站《sockets》版块原创发布, 转载请注明出处!
最新回复 (0)
  • TL;DR:不要使用不同的端口/插座进行发送和接收。

    从一个端口发送但在另一个端口接收会导致状态防火墙、网络地址转换等出现问题。传输的数据包将在中间盒(防火墙、路由器)中创建一个状态,并且为了匹配此状态,任何回复数据包都需要以原始发送者为目标,即相同的 IP 和端口。任何其他数据包将与任何现有状态不匹配,因此将被中间盒丢弃,从而导致数据包丢失和您遇到的超时。

  • 感谢您的回复。不幸的是,我不负责服务器端。它总是监听 192.168.1.100:53001 并将回复发送到 192.168.1.200:53000 。您解释说,传输的数据包将创建一个状态。这个状态是什么?为什么打开另一个套接字与它有关?

  • @TranNguDang:状态是发送方和接收方之间的关联,通常基于 IP、端口和协议。它通常用于强制传入数据仅在它们是对传出数据的回复时才被允许。由于具有不同端口的第二个套接字不是原始关联的一部分,传入回复与状态不匹配,因此被丢弃。通过从接收方套接字发送,您创建了一个与回复匹配的新状态。

  • 套接字是双向的。如果 1 个套接字就足以发送和读取,那么客户端没有理由使用 2 个套接字。特别是使用 UDP。使用较少的端口还可以使防火墙/路由器管理更容易

返回
作者最近主题: