我正在编写两个python脚本,使用python 套接字通过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
代替两个工作正常:
(msg, addr) = sock.recvfrom(6) #works ok, but isn't enough for my needs
任何想法我如何方便地分两部分读取传入的数据或为什么代码不能按预期工作?
答案 0 :(得分:5)
socket.recvfrom(size)
将(对于UDP套接字)读取一个数据包,最多size
个字节。多余的数据被丢弃。如果要接收整个数据包,则必须传递更大的bufsize,然后以比特形式处理数据包(而不是尝试以比特形式接收它。)
如果您想要一个更方便,更易变的网络I / O界面,请考虑Twisted。
答案 1 :(得分:2)
从UDP套接字读取整个数据报。
答案 2 :(得分:1)
UDP是基于消息的协议。 recvfrom
将读取最初发送的整个消息,但如果缓冲区不够大,则会抛出异常:
socket.error:[Errno 10040]在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或用于接收数据报的缓冲区小于数据报本身
所以我不知道为什么如果最初发送一个6字节的消息,你会挂在第二个recvfrom
上。你应该在第一个recvfrom
上抛出异常。也许发布客户端和服务器程序的实际工作,最小的例子。