在Python中,当在localhost上接受TCP套接字连接时,无法获得正确的对等体IP地址。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中,当在localhost上接受TCP套接字连接时,无法获得正确的对等体IP地址。相关的知识,希望对你有一定的参考价值。

我正在研究一个用于文件传输的P2P网络应用代码。每个对等体都有一个监听套接字,它可以接受传入的连接。

"服务器 "部分代码。

listening_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listening_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

try:
    listening_socket.bind((self.address, self.listening_port))
    break
except SocketError:
    return

listening_socket.listen(5)
listening_socket.setblocking(0)
self.listening_socket = listening_socket

####

new_connection, address = self.listening_socket.accept()
new_connection.setblocking(0)
print 'Accepted new connection from %s' % (peer_address)

"客户端 "部分的代码

try:
    sock = socket.create_connection((peer_address, peer_port), timeout=5)
except socket.error:
    return False
print 'Connected to %s' % (peer_address)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(0)

如果我把第一个对等体(服务器)绑定到127.0.0.1 第二个对等体(客户端)绑定到127.0.0.2(或任何其他来自环回子网的地址)并连接到127.0.0.1, 接受() 返回地址为'127.0.0.1',而不是'127.0.0.2'。如何在接受连接时显示正确的传入IP地址?

getpeername() 也返回'127.0.0.1'。

在本地wifi网络上,它显示正确的传入ip地址.我提到连接本身工作良好,我只需要显示正确的地址而不是'127.0.0.1'。

在Unix机器上测试。

我将感谢任何帮助。

答案

除非一个TCP客户端明确绑定到本地IP地址,否则它可能会使用接口上的任何一个本地IP地址,它提供了一个通往目标IP的路由。通常系统有一个隐含的内部顺序,如果有多个IP地址,则使用第一个IP地址。

在你的情况下,你只连接到目标IP 127.0.0.2。这个IP地址从127.0.0.1和127.0.0.2都可以到达,费用相同。127.0.0.1很可能是环回接口上的第一个IP地址,所以用这个作为源IP。如果你想让它不同,你需要显式绑定连接socket。在监听套接字上发生的事情并不重要--绑定是针对每个套接字而不是针对每个应用程序的。

绑定客户端套接字与绑定服务器套接字类似。

s = socket.socket()
s.bind(('127.0.0.2',0))
s.connect(('127.0.0.2', peer_port))

以上是关于在Python中,当在localhost上接受TCP套接字连接时,无法获得正确的对等体IP地址。的主要内容,如果未能解决你的问题,请参考以下文章

服务器是不是在主机“localhost”(127.0.0.1) 上运行并接受端口 5432 上的 TCP/IP 连接?

当在 Mysql 数据库服务器中触发触发器时,我可以在我的树莓派上运行 python 脚本吗?

如何在 python 中使用 S3TC/DXT 算法压缩 PNG 图像?

Python-“ AttributeError:'str'对象没有属性'Tc'(Tc是参数之一)[关闭]

tc指定IP地址限速

(python socket伪造client的ip地址) 有一python写的socket服务端只接受来自ip为169.