2016-09-19 5 views
1

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) 
+0

아마도 관련 : http://stackoverflow.com/questions/2862071/how-large-should-my-recv-buffer-be-when-calling-recv-in-the-socket-library (데이터 그램) – Caramiriel

답변

1

:

여기 내 예제 코드입니다. documentation for socket.recv 가입일

:

한번에 수신 할 데이터의 최대량은 BUFSIZE 의해 지정된다.

1024 또는 4096recv으로 전달합니다. man page for recv 가입일

: 메시지가 제공된 버퍼에 비해 너무 길면

는 과량 바이트 메시지로부터 수신되는 소켓의 종류에 따라 무시 될 수있다.

귀하의 의견에 따르면 한 번에 1 바이트 씩 헤더를 구문 분석하려고합니다. 데이터 그램 수신을 마친 후에는 헤더를 파싱 할 수 있습니다. 당신이 정말로 버퍼의 부분 읽기를 수행해야하는 경우

, recvsocket.MSG_PEEK 플래그를 전달하려고 :

MSG_PEEK

을이 플래그는의 시작 부분에서 데이터를 반환하는 받기 작동을하도록한다 대기열에서 해당 데이터를 제거하지 않고 대기열을 수신합니다. 따라서 후속 수신 호출은 동일한 데이터를 리턴합니다.

그러나 한 번에 한 바이트 씩 읽을 수는 있습니다.

+0

헤더를 한 번에 한 바이트 씩 파싱 할 수 있도록 bufsize를 1로 설정합니다. while 루프에 있으므로 다음 패스에서 다음 수신 바이트를 반환해야합니다. Rx 버퍼가 비어 있으면 차단해야합니다. 다른 9 바이트는 어디에 있습니까? 그것은 읽기와 함께 플러시를하고있는 것으로 보인다. – Bill

+0

다른 9 바이트는 버려집니다. 위의'recv' 맨 페이지의 발췌 부분을보십시오. –

+0

그래서 부분 버퍼를 읽을 방법이 없습니까? – Bill