首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Python/TFTP-Server)如何侦听非(尚未)存在的IP地址(RNDIS)?

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

Stack Overflow用户
提问于 2017-12-05 14:12:33
回答 1查看 747关注 0票数 1

伙计们,

我的问题是:我想为一个不存在的IP地址启动一个(tftp)服务器.服务器是为USB/RNDIS服务的,其IP地址仅在有实际网络(流量正在进行)时才存在,但我想‘早’启动服务器(例如Windows启动时)。

方法是将套接字绑定到0.0.0.0,然后检查每个请求的“有效”地址。

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

我怎样才能得到这个客户的IP地址?(当然,我至少可以检查同一个子网,但我需要真正的服务器地址--这个客户端正在交谈的地址!)

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

干杯。

附注:这是用于Python tftpy服务器..。--在启动服务器时,我需要从客户端切换,这是相当大的.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-05 14:57:54

没有办法直接得到本地地址,但是有一个通常对你有用的技巧。

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

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

代码语言:javascript
复制
>>> 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上是可行的。我不是百分之百肯定它在Windows上会以同样的方式工作,但它似乎是合理的期望它会。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47655674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档