recv가 예상대로 작동하지 않습니다. 10 바이트 (wireshark로 확인)를 보내고 recv는 첫 번째 바이트 만 받고 나머지는 폐기합니다 (다음 sendto까지). 멀티 캐스트일까요? 나는 유니 캐스트 UDP로이 똑같은 일을했고 아무런 문제가 없다고 확신한다. 하나에 버퍼 크기를 설정하기 때문에 단 하나의 바이트를 얻고있다파이썬 recv 멀티 캐스트가 1 바이트를 반환합니다.
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)
아마도 관련 : http://stackoverflow.com/questions/2862071/how-large-should-my-recv-buffer-be-when-calling-recv-in-the-socket-library (데이터 그램) – Caramiriel