2016-09-19 8 views
1

recvが期待どおりに動作していません。 私は10バイト(wiresharkで検証)を送信しています。recvは最初のバイトを取得して残りを破棄します(次のsendtoまで)。 これはマルチキャストのものですか?私はユニキャストUDPでこれと同じことをやったことがあり、何の問題もないと確信しています。あなたがいずれかにあなたのバッファサイズを設定するので、あなたは1バイトのみを取得しているPython recv multicastは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

このフラグは、当初からデータを返すために受信動作を引き起こしキューからそのデータを削除することなくキューを受信する。したがって、後続の受信呼び出しは同じデータを返します。

ただし、一度に1バイトを読み取ることはできません。

+0

bufsizeを1に設定して、ヘッダを1バイトずつ解析することができます。 whileループのため、次のパスで次の受信バイトを返す必要があります。 Rxバッファが空の場合、それはブロックされるはずです。 他の9バイトはどこに行くのですか?それは読んで一緒にフラッシュしているようだ。 – Bill

+0

他の9バイトは破棄されます。上の 'recv'マンページの抜粋を参照してください。 –

+0

部分的にバッファを読み込む方法はありませんか? – Bill

関連する問題