伙计们,
我的问题是:我想为一个不存在的IP地址启动一个(tftp)服务器.服务器是为USB/RNDIS服务的,其IP地址仅在有实际网络(流量正在进行)时才存在,但我想‘早’启动服务器(例如Windows启动时)。
方法是将套接字绑定到0.0.0.0,然后检查每个请求的“有效”地址。
这种方法的问题是: recfrom()只返回源地址(客户端),而不返回目标(服务器)!
我怎样才能得到这个客户的IP地址?(当然,我至少可以检查同一个子网,但我需要真正的服务器地址--这个客户端正在交谈的地址!)
或者,是否有任何选项可以让bind()使用不存在的IP地址?
干杯。
附注:这是用于Python tftpy服务器..。--在启动服务器时,我需要从客户端切换,这是相当大的.
发布于 2017-12-05 14:57:54
没有办法直接得到本地地址,但是有一个通常对你有用的技巧。
假设您刚刚从recvfrom获得了一个缓冲区和客户端地址。现在创建一个新的辅助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上是可行的。我不是百分之百肯定它在Windows上会以同样的方式工作,但它似乎是合理的期望它会。
https://stackoverflow.com/questions/47655674
复制相似问题