如何避免使用相同端口号python的两个套接字

时间:2015-02-21 19:29:50

标签: python sockets

现在这里是socket的服务器部分的示例。 我想让serverSocket和connectionSocket具有不同的端口号,但是现在,它们使用相同的端口号。

from socket import *
serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind((‘’,serverPort))
serverSocket.listen(1)
print (‘The server is ready to receive’)
while 1:
 connectionSocket, addr = serverSocket.accept()

 sentence = connectionSocket.recv(1024)
 capitalizedSentence = sentence.upper()
 connectionSocket.send(capitalizedSentence)
 connectionSocket.close()

如果他们使用相同的端口号,是否会发生冲突?

2 个答案:

答案 0 :(得分:1)

没有什么可以避免的,并且确实没有简单的方法可以避免它 - 这就是TCP应该如何工作的方式。

在TCP中有两种套接字:

  • 监听服务器套接字
  • 连接套接字

服务器套接字开始使用listen侦听传入连接;并等待与accept的客户端连接。客户端创建一个连接到服务器地址(host, port)的套接字。当服务器accept成为连接时,会在(client_address, client_port)(server_address, server_port)之间创建连接套接字。如果数据包是连接请求,或者发往已连接的套接字,则服务器上的TCP堆栈可以轻松地从状态位查看。如果是已连接的套接字之间的通信,则它会找到绑定在本地地址上的文件描述符,本地端口与源端口,远程端的源端口连接。 / p>

连接的套接字与侦听服务器套接字具有相同的端口;套接字的Ende知道4件事:本地地址本地端口远程地址远程端口。您可以在10.20.30.40:12345上绑定1个服务器套接字,同时将数千个套接字从10.20.30.40:12345连接到数千个不同的地址。

仅在连接尝试阶段存在拥塞; server_socket.listen(1)表示服务器只排队1个传入连接;后续连接将被拒绝,直到接受传入连接。

来自Linux手册页,listen(2) backlog参数sock.listen上的ECONNREFUSED

  

backlog参数定义了最大长度   sockfd的挂起连接队列可能会增长。如果在队列满时到达连接请求,则客户端可以   收到错误,显示{{1}}或者,如果是   底层协议支持重传,请求可能是   忽略,以便稍后重新连接成功。

答案 1 :(得分:0)

Althouh我从来没有在Python中使用过原始套接字,我想这个问题更普遍地涉及TCP和IP如何工作。

当服务器侦听端口上的连接时,客户端将连接到那个端口,并且可以通过四重(server_addr,server_port,client_addr,client_port)识别TCP连接< / em>,因此当发送或接收属于不同连接的数据包时没有歧义,因为(client_addr,client_port)部分对于每个数据包都是不同的。

也就是说,寻址没有冲突。

但是,请注意,服务器在接受每个请求后派生(或生成一个线程)是很常见的,这样主进程(或线程)可以保持acceprint连接,而其他连接由分叉进程(或线程)处理。在您的情况下,相反,一旦您的服务器开始处理请求,它会在再次调用accept()之前计算响应,因此任何其他客户端必须等待其服务请求之前。