首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python本地主机上接受TCP套接字连接时,无法获得正确的对等ip地址

在Python本地主机上接受TCP套接字连接时,无法获得正确的对等ip地址
EN

Stack Overflow用户
提问于 2020-05-30 11:09:49
回答 1查看 545关注 0票数 0

我正在编写用于文件传输的P2P网络应用程序代码。每个对等点都有一个监听套接字,可以在其上接受传入的连接。

“服务器”部分代码:

代码语言:javascript
运行
复制
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)

"Client“部分代码:

代码语言:javascript
运行
复制
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',则accept()返回地址为'127.0.0.1’,而不是'127.0.0.2‘。如何在接受连接时显示正确的传入ip地址?

getpeername()还返回'127.0.0.1‘。

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

在Unix机器上进行测试。

我很感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-30 17:07:45

除非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。如果您想让它不同,则需要显式地绑定连接套接字。您的侦听套接字绑定是每个套接字而不是每个应用程序,这并不重要。

绑定客户端套接字类似于绑定服务器套接字:

代码语言:javascript
运行
复制
s = socket.socket()
s.bind(('127.0.0.2',0))
s.connect(('127.0.0.2', peer_port))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62101555

复制
相关文章

相似问题

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