我让服务器绑定到特定端口:
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 /端口连接到同一台服务器吗?
由于
答案 0 :(得分:-1)
如果您具有这样做的权限(< 1024,您需要是root用户),并且没有其他套接字位于同一接口上的同一端口,则绑定到某个端口应始终有效。
除非您使用SO_REUSEPORT
,否则您可以将多个监听套接字绑定到同一端口。
试想一下,服务器端如何知道在哪里发送回复? (假设这里没有任播路由魔法。)
如果您注释掉client_sock.bind()
,那么内核会选择一个空闲端口作为连接源,这样就可以解释为什么每个connect()
后端口都不同。
服务器accept()
的对应部分是客户端的connect()
,而不是send()
。因此,每当其他套接字连接到该侦听套接字时,您应该进行accept()
调用。如果您想对收到的消息做出反应,请使用client_sock.recv()
。 (Docs)。