Python recv多播返回一个字节

时间:2016-09-19 15:19:39

标签: python blocking multicast recv

recv未按预期工作。 我发送10个字节(用wireshark验证),recv只获取第一个字节并丢弃其余字节(直到下一个sendto)。 这是一个多播的东西吗?我非常确定我已经使用单播UDP做了同样的事情并且没有任何问题。

这是我的示例代码:

import struct, socket, multiprocessing, time

MCAST_PORT = 62950
MCAST_GRP = '239.0.0.13'

def _Rx(self, RXsock, Queue):
   print "Receiver started"
   while True:
      # State machine goes here to parse header and recv (<msglen>) bytes.
      print "Waiting Rx char...", RXsock
      char = RXsock.recv(1)  # Blocks here after first byte ("1") ???
      print "Rx", hex(ord(char))



TXsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
TXsock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)

RXsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
RXsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
RXsock.bind((MCAST_GRP, MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
RXsock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

RxQueue = multiprocessing.Queue()
receiver = multiprocessing.Process(target=_Rx, args=(None, RXsock, RxQueue))
receiver.daemon = True
receiver.start()


TXsock.sendto("09123456789", (MCAST_GRP, MCAST_PORT))
time.sleep(3)

1 个答案:

答案 0 :(得分:1)

您只获得一个字节,因为您将缓冲区大小设置为1。

来自documentation for socket.recv

  

一次接收的最大数据量由bufsize指定。

尝试将10244096传递给recv

来自man page for recv

  

如果消息太长而无法容纳在提供的缓冲区中,则可能会丢弃多余的字节,具体取决于接收消息的套接字类型。

您的评论说您尝试一次解析一个字节的标头。完成接收数据报后,您始终可以解析标题。

如果您确实需要部分读取缓冲区,请尝试将socket.MSG_PEEK标记传递给recv

  

MSG_PEEK

     

此标志使接收操作从接收队列的开头返回数据,而不从队列中删除该数据。因此,后续的接收调用将返回相同的数据。

但是,您仍然无法一次读取一个字节。