python3套接字recvfrom仅从netcat接收数据

python3套接字recvfrom仅从netcat接收数据,python,sockets,Python,Sockets,我试图为rtp序列跟踪创建一个简单的python程序,但遇到了一个奇怪的问题。我可以在tcpdump上看到rtp数据,但是当我运行脚本recvfrom时,我确认netstat打开了端口,如果我使用netcat发送数据,脚本确实会接收数据 #!/usr/bin/python3 import socket, threading, time import datetime, sys def main(): """ MAIN """ #udp = rxUdp()

我试图为rtp序列跟踪创建一个简单的python程序,但遇到了一个奇怪的问题。我可以在tcpdump上看到rtp数据,但是当我运行脚本recvfrom时,我确认netstat打开了端口,如果我使用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()
我应该提到的是,这段代码似乎在Windows7上有效,但在ubuntu上无效

这是我的rtp流的tcpdump输出

10:26:57.486256 IP 209.87.232.169.57346>192.168.1.100.6022:UDP,长度1328 0x0000:4500 054c 66e6 0000 3d11 95ad d157 e8a9东..左..西。。 0x0010:c0a8 0164 e002 1786 0538 9797 8021 eddc…d…8。。。!。。 0x0020:6512 e48b e7a0 747d 4700 6513 e.…t}G.e

以下是netcat的tcpdump输出

10:26:51.709234 IP 192.168.2.149.52305>192.168.2.241.6022:UDP,长度3
0x0000:4500001F 7d3c 4000 4011 36bb c0a8 0295 E.}好了,大家想出来了,如果有人把头撞到墙上,我的解决方案就留在这里

所以问题是 net.ipv4.conf.all.rp_筛选器,net.ipv4.conf.eth1.rp_筛选器,net.ipv4.conf.eth2.rp_筛选器 我在这里找到了答案

基本上,这些配置所做的是过滤掉任何不是来自本地lan的数据,以防止欺骗。我将它们全部设置为0,然后启动脚本


感谢您的评论并花时间查看

好吧,伙计们,如果有人把头撞到墙上,我会把我的解决方案留在这里

所以问题是 net.ipv4.conf.all.rp_筛选器,net.ipv4.conf.eth1.rp_筛选器,net.ipv4.conf.eth2.rp_筛选器 我在这里找到了答案

基本上,这些配置所做的是过滤掉任何不是来自本地lan的数据,以防止欺骗。我将它们全部设置为0,然后启动脚本


感谢您的评论并花时间查看

那么,您的程序运行在哪个IP上,
192.168.2.241
192.168.1.100
?您的程序适合我。你确定你的ip地址是正确的,并且你没有试图用你的windows计算机ip地址在ubuntu中运行吗?尝试将ip地址替换为0.0.0.0,以便它侦听所有接口。如果您查看我的.bind,您可以看到我取出了udp_ip,以便它绑定到所有接口,我的ubuntu机器有192.168.1.100 eth1和192.168.2.241 eth2。它将在任何一个界面上接受来自netcat的消息,但它似乎看不到rtp数据。那么,您的程序运行在哪个IP上,
192.168.2.241
192.168.1.100
?您的程序适合我。你确定你的ip地址是正确的,并且你没有试图用你的windows计算机ip地址在ubuntu中运行吗?尝试将ip地址替换为0.0.0.0,以便它侦听所有接口。如果您查看我的.bind,您可以看到我取出了udp_ip,以便它绑定到所有接口,我的ubuntu机器有192.168.1.100 eth1和192.168.2.241 eth2。它将在任何一个接口上接受来自netcat的消息,但似乎看不到rtp数据。