我正在编写两个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
而不是两个可以正常工作:
你知道我如何方便地分两部分读取传入的数据吗?知道为什么代码不能按预期工作吗?在
从UDP套接字中读取整个数据报。在
socket.recvfrom(size)
将(对于UDP套接字)读取一个数据包,最多为size
个字节。多余的数据被丢弃。如果你想接收整个数据包,你必须传递一个更大的bufsize,然后以位处理数据包(而不是尝试以位接收数据包)如果您想要一个更方便、更少变化无常的网络I/O接口,请考虑Twisted。在
UDP是一种基于消息的协议。
recvfrom
将读取最初发送的整个消息,但如果缓冲区不够大,它将引发异常:因此,我不确定如果最初发送的是6字节的消息,为什么要挂起第二个
recvfrom
。您应该在第一个recvfrom
上引发异常。可能会发布一个实际工作的、最小的客户机和服务器程序示例。在相关问题 更多 >
编程相关推荐