【问题标题】:porting Linux socket programming (Python) to Windows将 Linux 套接字编程 (Python) 移植到 Windows
【发布时间】:2021-05-15 06:06:29
【问题描述】:

我有一个代码,其中包含与此类似的内容,可在 Linux 中使用。现在我想将它移植到 Windows。我知道 Windows 使用 winsock 进行套接字编程,但是否也可以在 Windows 中实现这个 python 模块“套接字”?

   ```
     import socket
    host = self.config.get_config('BASE_ADDRESS',BASE_ADDRESS_VAL)
    port = self.config.get_config('BASE_PORT',BASE_PORT_VAL)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,socket.IPPROTO_UDP)
    if sock is None:
        print('could not open socket')
        sys.exit(1)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.append(sock)
    self.log.info('Listening to %s:%s' % (host, port))
    try:
        sock.bind((host, int(port)))

    except socket.error as msg:
        print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
        sys.exit()
    #sock.bind(("10.0.0.1", ""))
    while self.winParent.ongoing==True:
        try:
            r,w,e = select.select(self.sock, [], self.sock,self.timeout)
            for sock in r:
                data, addr = sock.recvfrom(556)
                #something = sock.recvfrom(556)
                #print(something[0].decode())
                self.handle(sock, addr, data)
        except (Exception, e):
            import traceback
            self.log.critical('%s\n%s' % (str(e), traceback.format_exc()))
            time.sleep(1)

    for sock in self.sock:
        sock.close()
    self.sock = []
My code gets stuck at "r,w,e = select.select(self.sock, [], self.sock,self.timeout)".


On investigating with Wireshark, I can see the following:


  [1]: https://i.stack.imgur.com/zNxKH.png

I have the following points of doubt :
(1) Could this be a firewall issue?  I have added python.exe to allow through Firewall in Windows Defender. Am I missing something basic?
(2) Should I have the winsock.dll installed separately?

【问题讨论】:

  • socket 库可以在 Windows 和 Linux 上运行,为什么要移植它?
  • @rozumir 我正在移植一个现在在 Linux PC 上运行的代码库,以便在 Windows PC 上运行。而这个套接字编是它的一部分。我无法在我的 PC 和通过 PoE 连接的硬件之间建立套接字通信。我想知道这个 python 模块是否适用于 Windows。
  • socket 模块在 Windows 上运行良好。您是否尝试从本地机器发送数据报?

标签: python linux windows sockets firewall


【解决方案1】:

socket 模块在 Windows 上运行良好,这不是问题的根源。正如您所指出的,这是您的代码卡住的select(posix select() 是传统的Unix 服务套接字的方式)。它应该被卡住了,因为它正坐着等待传入的数据包:) 你正在向它发送一些数据包,对吧?

由于您期待传入的 UDP 数据包,Windows 防火墙可能需要额外的说服来允许这些数据包。使用快速的 Google 搜索仔细检查。

【讨论】:

  • 如果 (self.sock, [], self.sock) 是 3 个空可迭代的元组,那么 self.sock, self.sock, self.sock) 也会...
  • 措辞有点模糊,但没有提到元组。这些是函数参数,在我的解释中,每个参数都必须提供一个可以交互的值(如果只有一次)。仔细想想,这并没有多大意义。可能 Windows 防火墙只是阻止了传入的 UDP 数据包。
  • 不,它是明确的:只要不是所有三个都是空的,任何可迭代的都可能是空的。我已经成功地在 Windows 上为 wlistxlist 使用空迭代,前提是 rlist 至少包含一个套接字。在更复杂的用例中,当wlist 不为空时,我可以为rlistxlist 使用空列表。
  • 是的,这样会更有意义。我会更新我的答案。
猜你喜欢
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多