2017-07-18 11 views
0

rtpシーケンストラッキング用の単純なpythonプログラムを作成しようとしていますが、奇妙な問題に遭遇しました。私はtcpdumpでrtpデータを見ることができますが、スクリプトrecvfromを実行すると、ポートがnetstatでオープンしていることを確認しました.netcatを使ってデータを送信すると、スクリプトはデータを受信します。python3ソケットrecvfromはnetcatからのみデータを受け取ります

#!/usr/bin/python3 

import socket, threading, time 
import datetime, sys 



def main(): 
    """ 
    MAIN 
    """ 
    #udp = rxUdp() 
    #udp.startUDPRx() 

    udp_ip = '192.168.1.100' 
    udp_port = 6022 

    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #IP/UDP 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
    sock.bind(('', udp_port)) 
    #sock.bind(('eth1', 0)) 


    expected_rtp_seq = None 
    print('Running') 
    ts_file = open('test.ts', 'wb') 
    #while True: 
    for i in range (1, 1000): 

     data = b'' 
     data, addr = sock.recvfrom(1500) #buffer size 
     rtp_sequence_no = data[2:4] 
     rtp_sequence_no = int.from_bytes(rtp_sequence_no, byteorder='big') 

     rtp_len = data[19:20] 

     mpegts_data = data[12:len(data)] 
     print(rtp_sequence_no) 
     print('.', end='') 
     sys.stdout.flush() 
     ts_file.write(mpegts_data) 
     print(len(data))  
     if expected_rtp_seq == None: 
      expected_rtp_seq = rtp_sequence_no 
     if expected_rtp_seq != rtp_sequence_no: 
      print('\n%s: Sequence Mismatch. Expected %d, got %d' % 
       (datetime.datetime.now(), expected_rtp_seq, rtp_sequence_no)) 
      expected_rtp_seq = rtp_sequence_no 

     if expected_rtp_seq == 65535: 
      expected_rtp_seq = 0 
     else: 
      expected_rtp_seq += 1 


    ts_file.close() 



if __name__ == '__main__': 
    main() 

このコードはWindows 7では動作しているようですが、ubuntuでは動作しません。 26::ここで

は私のRTPストリーム

10用のtcpdumpの出力である57.486256 IP 209.87.232.169.57346> 192.168.1.100.6022:UDP、長さ1328 0000:4500 054cの66e6 0000 3D11 95ad d157 e8a9 E..Lf ... = .... W ... 0x0010:c0a8 0164 e002 1786 0538 9797 8021 eddc ... d ..... 8 ...! 0x0020:6512 e48b e7a0 747d 4700 6513e ..... t} Ge 26:

ここでは、netcatを

10からのtcpdumpの出力である51.709234 IP 192.168.2.149.52305> 192.168.2.241.6022:UDP、長さ3 0000:7d3c 4000 4011 4500 001F 36bb c0a8 0295 E ...} < @。@ 6 ..... 0x0010:c0a8 02f1 cc51 1786 000b 22c0 6869 0a00 ..... Q .... "hi ... 0x0020:0000 0000 0000 0000 0000 0000 ............

お探しの方

+0

「192.168.2.241」または「192.168.1.100」で動作しているプログラムはどれですか? –

+0

あなたのプログラムは私のために働きます。あなたのIPアドレスが正しいと確信している、あなたのWindowsコンピュータのIPアドレスでubuntuで実行しようとしていないのですか?すべてのインターフェイスをリッスンするように、IPアドレスを0.0.0.0に置き換えてみてください。 – Hannu

+0

私の.bindを見れば、udp_ipを取り出してすべてのインターフェースにバインドすることがわかります。私のubuntuマシンは192.168.1.100 eth1と192.168.2.241 eth2です。どちらのインターフェースでもnetcatからのメッセージは受け入れられますが、rtpデータは見えません。 – Ryan

答えて

0

他の誰かが壁に頭を向けていると、大丈夫だとわかった。

だから、問題は がすべて有効になっていましたnet.ipv4.conf.eth2.rp_filter net.ipv4.conf.all.rp_filter、net.ipv4.conf.eth1.rp_filterは、https://serverfault.com/a/216568ここに私の答えを見つけたことでした。

基本的にこれらの設定は、あなたのローカルLANから送信されていないすべてのデータをフィルタリングして、スプーフィングを防止します。すべて0に設定してスクリプトを起動します。

コメントをいただきありがとうございます。

関連する問題