(Python/TFTP-Server) 如何收听一个非(尚未)存在的 IP 地址 (RNDIS)?

(Python/TFTP-Server) how to listen to an non (yet) existing IP-address (RNDIS)?

大家好,

我的问题:我想为一个不存在的 IP 地址启动一个 (tftp) 服务器。 该服务器用于 USB/RNDIS ,其中它的 IP 地址本质上仅在实际网络流量发生时才存在——但我想启动服务器 'early' (例如,当 Windows开始)。

想法是将套接字 bind() 到 0.0.0.0 - 然后检查每个请求的 "valid" 地址。

该方法的问题:recfrom() 仅 returns 源地址(客户端),而不是目标地址(服务器)!

如何获取此客户端与之通信的 IP 地址? (我当然可以至少检查同一个子网,但我需要这个客户端正在与之交谈的真实服务器地址!)

或者,是否有任何选项可以让 bind() 使用不存在的 IP 地址?

干杯。

p.s。 这是 Python tftpy 服务器... -- 目前我需要在启动服务器时从客户端进行 ping,这很无聊...

无法直接获取本地地址,但有一个技巧通常对您有用。

假设您刚刚从 recvfrom 获得了缓冲区和客户端地址。现在你创建一个new辅助UDP套接字,connect它到客户端的地址,然后使用getsockname获取这个新套接字上的本地地址。 (使用 UDP,connect 实际上不会向对等方发送任何内容,它只是进行地址解析。)

所以通过这种方式,您可以发现服务器系统 将使用 作为源的 IP 地址,如果它将数据报发送回客户端系统。这通常与客户端用于定位服务器的地址相同。

>>> cbytes, caddr = server_sock.recvfrom(2048)
>>> print(caddr)                           # Client IP and port
('192.168.0.11', 38869)

>>> aux_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> aux_socket.connect((caddr[0], 9999))   # Connect back to client (port doesn't matter)
>>> saddr = aux_socket.getsockname()       # Get local IP and port (ignore port here too)
>>> print(saddr)
('192.168.0.12', 39753)

这适用于 linux。我不是 100% 确定它会以相同的方式在 Windows 上工作,但似乎可以合理地期望它会。