Python套接字 - 使用相同的src IP /端口连接不起作用

时间:2015-08-24 06:12:18

标签: python sockets tcp

我让服务器绑定到特定端口:

serv_sock = socket(AF_INET, SOCK_STREAM)
serv_sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serv_sock.bind((gethostname(), MAGIC_FLOW_PORT))
serv_sock.listen(MAX_MAGIC_FLOWS)

while True:
    (client_sock, address) = serv_sock.accept()
    print "Accepted a flow"

客户这样做:

client_sock = socket(AF_INET, SOCK_STREAM)
client_sock.bind((gethostname(), MAGIC_FLOW_PORT+1))
client_sock.connect((server_ip, MAGIC_FLOW_PORT))
while True:
    client_socket.send("ABCDEF") 
    time.sleep(5)

所以期望客户端每隔5秒发送一个带有src端口MAGIC_FLOW_PORT + 1和dst端口MAGIC_FLOW_PORT的TCP / IP数据包。 我在服务器中启用了tcpdump,我可以按照预期的每5秒看到数据包。但是,服务器只打印一次“接受流”,之后没有打印。

但是如果我在客户端套接字中注释这一行:

client_sock.bind((gethostname(), MAGIC_FLOW_PORT+1))

客户端然后每次生成一个具有不同src端口的数据包,服务器接受该数据包。我也用

尝试了服务器
serv_sock.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)

我仍然没有收到服务器的第二个数据包。

我可以多次将同一个src IP /端口连接到同一台服务器吗?

由于

1 个答案:

答案 0 :(得分:-1)

如果您具有这样做的权限(< 1024,您需要是root用户),并且没有其他套接字位于同一接口上的同一端口,则绑定到某个端口应始终有效。

除非您使用SO_REUSEPORT,否则您可以将多个监听套接字绑定到同一端口。 试想一下,服务器端如何知道在哪里发送回复? (假设这里没有任播路由魔法。)

如果您注释掉client_sock.bind(),那么内核会选择一个空闲端口作为连接源,这样就可以解释为什么每个connect()后端口都不同。

服务器accept()的对应部分是客户端的connect(),而不是send()。因此,每当其他套接字连接到该侦听套接字时,您应该进行accept()调用。如果您想对收到的消息做出反应,请使用client_sock.recv()。 (Docs)。