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

标签 python sockets server tftp

大家好,

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

想法是将套接字绑定(bind)()到 0.0.0.0 - 然后检查每个请求是否有“有效”地址。

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

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

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

干杯。

附: 这是用于 Python tftpy 服务器的... -- 目前我需要在启动服务器时从客户端 ping,这很无聊......

最佳答案

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

假设您刚刚从 recvfrom 获取了缓冲区和客户端地址。现在,您创建一个辅助UDP套接字,将其连接到客户端的地址,然后使用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 上会以同样的方式工作,但似乎可以合理地预期它会如此。

关于python - (Python/TFTP-Server)如何监听(尚未)现有的IP地址(RNDIS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47655674/

相关文章:

linux - Ubuntu linux Server 12.04.5 LTS 无法安装 apt-show-versions

python - 将 python C 包安装到 bin 文件夹中

python - 基于示例代码在 View 中保存的最佳实践

vb.net - VB.NET 3.5 SocketException在部署但不在开发机器上

c - DNS 查询结构

python - Gevent.monkey.patch_all 破坏依赖于 socket.shutdown() 的代码

python - 使用 anyio.TaskGroup 和 fastapi.StreamingResponse

python - 如何找到最小均方误差二次上限?

Java通过tcp将进程数组发送到服务器

.htaccess - htaccess https ://not redirecting to https://www