python:调用插座.recvfrom()twi

2024-10-02 20:40:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写两个python脚本,使用pythonsockets通过UDP进行通信。下面是代码的相关部分

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))
s.setblocking(True) #I want it to be blocking
#(...)
(msg, addr) = sock.recvfrom(4)
#(...)
(msg2, addr2) = sock.recvfrom(2)

我希望接收是阻塞的,在我阅读第一个4字节部分之前,我不知道整个消息的大小。上面的代码在sock.recvrfom(2)部分被阻塞,而被修改的是一个sock.recvfrom而不是两个可以正常工作:

^{pr2}$

你知道我如何方便地分两部分读取传入的数据吗?知道为什么代码不能按预期工作吗?在


Tags: 代码脚本hostbindportsocketsockudp
3条回答

从UDP套接字中读取整个数据报。在

socket.recvfrom(size)将(对于UDP套接字)读取一个数据包,最多为size个字节。多余的数据被丢弃。如果你想接收整个数据包,你必须传递一个更大的bufsize,然后以位处理数据包(而不是尝试以位接收数据包)

如果您想要一个更方便、更少变化无常的网络I/O接口,请考虑Twisted。在

UDP是一种基于消息的协议。recvfrom将读取最初发送的整个消息,但如果缓冲区不够大,它将引发异常:

socket.error: [Errno 10040] A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself

因此,我不确定如果最初发送的是6字节的消息,为什么要挂起第二个recvfrom。您应该在第一个recvfrom上引发异常。可能会发布一个实际工作的、最小的客户机和服务器程序示例。在

相关问题 更多 >