【问题标题】:Python socket listening to specific interfacePython socket 监听特定接口
【发布时间】:2020-07-17 10:08:51
【问题描述】:

我目前有一个树莓派,它被设置为 wifi 到以太网桥。树莓派充当我拥有的整个以太网子网的接入点。子网和网桥工作完美,但是当我尝试让我的 python 程序在树莓派上监听以太网接口/子网上的请求时,它似乎没有这样做。它设置为将套接字绑定到('',10000),但它从不接收任何消息。但是,它能够通过套接字将消息发送到子网就好了,只是不接收。我认为它正在侦听 wifi 接口而不是以太网接口,但我不确定如何指定套接字应该侦听的接口。

这是我的接收代码

receive_group = ('',10000)
receive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

receive.bind(receive_group)

while(True):
   data, address = receive.recv(65536)
   print(data)

【问题讨论】:

    标签: python sockets raspberry-pi


    【解决方案1】:

    绑定部分应该是正确的。接收部分是错误的,因为recv 只返回(字节)数据,你应该使用recvfrom 来获取发送者地址。但这应该可行:

    import socket
    receive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    receive.bind(('', 10000))
    while True:
        data, address = receive.recvfrom(64)
        print(data, address)
    

    我在发送部分使用了这个代码:

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.sendto(b'foo', (addr, 10000))
    

    其中 addr 是接收器的(可达)地址之一,并且接收器可以成功地从其任何接口接收数据。

    【讨论】:

    • 我尝试将您的代码完全复制到我的两个系统上,但它仍然没有收到任何发送给它的数据。从接入点(树莓派 3)到另一台计算机(树莓派 0)的连接有效,但反之则不行
    【解决方案2】:

    要从socket.recv 获取一些东西,必须连接到这个套接字并发送一些东西。您确定网络上的某些程序正在这样做吗?

    要监听/嗅探数据包和网络流量,最好使用pyshark

    【讨论】:

    • 是的,我确信有东西正在发送数据。我在另一个树莓派上运行相同的程序,并且套接字从树莓派接入点工作到另一个树莓派,但不是相反
    【解决方案3】:

    原来这与 python 无关。当我在 pi 上创建接入点时,它创建了一个阻止该端口的防火墙规则,即使我从未以这种方式配置防火墙。向该端口添加异常解决了我的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-01
      • 2015-11-28
      • 1970-01-01
      • 2018-03-18
      • 2013-09-10
      • 2011-11-06
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多