1. 程式人生 > >TCP server 為什麼一個埠可以建立多個連線?

TCP server 為什麼一個埠可以建立多個連線?

轉自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