为什么Linux客户端的情况下不支持端口共用?

新手上路,请多包涵

客户端发起tcp连接con1:Aip: Aport—>Bip:Bport,没有问题,不关闭连接,
再发起tcp连接con2:Aip:Aport—>Cip:Bport,就会address already in use,根据四元组,两个连接并不是同一个连接,为什么端口不可以共用呢?是客户端发起连接,并且指定某个端口的情况下

阅读 2.7k
2 个回答

通俗一点举个例子:电话亭里只有一个电话,如果这个电话别人正在使用,那你还能用吗?

放在 ip 通信上面也是同理。所以一般客户端向服务端发请求是不会指定端口的,而是让系统自动分配一个(当你不指定端口时,系统就会自动分配)。

也不是不可以, 如果是socket的话只要设置端口复用就可以实现,随便写一段代码演示一下

#/bin/python
import sys
import time
import socket

def start_tcp_client(ip, port):

    #server port and ip
    server_ip = ip
    servr_port = port
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用和地址复用
    tcp_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcp_client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

    tcp_client.bind(('0.0.0.0', 23333))
    tcp_client.connect((server_ip, servr_port))
    # 没啥意义地一直接收数据
    while True:
        print tcp_client.recv(1024)
        time.sleep(1)


ip = sys.argv[1]
port = int(sys.argv[2])
start_tcp_client(ip, port)

然后启动两个进程连接不同的数据库

p1

[root@chengqm test]# python same_port_socket.py 10.0.0.247 3306
M
5.7.9-log{De~uf~ÿ?CO,Gdn0{;uumysql_native_password
Xshell

p2

[root@chengqm test]# python same_port_socket.py 10.0.0.248 3306
M
5.7.9-logĕ-4WHKmÿ?TD":+ZHN~&mysql_native_password

查看端口状态

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题