TCP server 為什麼一個埠可以建立多個連線?
阿新 • • 發佈:2019-01-05
轉自segment fault
TCP server 可以,TCP client 也可以。一個套接字只能建立一個連線,無論對於 server 還是 client。
注意報錯訊息是:
[Errno 106] (EISCONN) Transport endpoint is already connected
man 2 connect 說得很清楚了:
Generally, connection-based protocol sockets may successfully connect() only once; connectionless protocol sockets may use connect() multiple times to change their association.
就是說,TCP 套接字最多隻能呼叫 connect 一次。那麼,你的監聽套接字呼叫 connect 了幾次?
來點有意思的。
一個套接字不能連線兩次,並不代表一個本地地址不能用兩次,看!加粗文字加粗文字
>>> import socket
>>> s = socket.socket()
# since Linux 3.9, 見 man 7 socket
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s2 = socket.socket ()
>>> s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
>>> s.bind(('127.0.0.1', 12345))
>>> s2.bind(('127.0.0.1', 12345))
# 都可以使用同一本地地址來連線哦
>>> s.connect(('127.0.0.1', 80))
>>> s2.connect(('127.0.0.1', 4321))
>>> netstat -npt | grep 12345
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:4321 127.0.0.1:12345 ESTABLISHED 18284/python3
tcp 0 0 127.0.0.1:12345 127.0.0.1:4321 ESTABLISHED 4568/python3
tcp 0 0 127.0.0.1:80 127.0.0.1:12345 ESTABLISHED -
tcp 0 0 127.0.0.1:12345 127.0.0.1:80 ESTABLISHED 45