我正在编写用于文件传输的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)"Client“部分代码:
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机器上进行测试。
我很感谢你的帮助。
发布于 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。如果您想让它不同,则需要显式地绑定连接套接字。您的侦听套接字绑定是每个套接字而不是每个应用程序,这并不重要。
绑定客户端套接字类似于绑定服务器套接字:
s = socket.socket()
s.bind(('127.0.0.2',0))
s.connect(('127.0.0.2', peer_port))https://stackoverflow.com/questions/62101555
复制相似问题