(Python / TFTP-Server)如何监听非(尚)现有的IP地址(RNDIS)?

时间:2017-12-05 14:12:34

标签: python sockets server tftp

Hy伙计,

我的问题:我想为不存在的IP地址启动(tftp)服务器。 服务器用于USB / RNDIS,其中IP地址本质上仅在存在实际网络流量时存在 - 但我想早期启动服务器' (例如,当Windows启动时)。

想法是将套接字绑定到0.0.0.0 - 然后检查每个请求"有效"地址。

该方法的问题:recfrom()只返回源地址(客户端),但不返回目标(服务器)!

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

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

欢呼声。

P.S。 这是为Python tftpy服务器... - 目前我需要在启动服务器时从客户端进行ping操作,这很简单...

1 个答案:

答案 0 :(得分:1)

没有办法直接获取本地地址,但通常会有一些技巧。

我们说你刚从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上的工作方式是否相同,但预计它会合理。