你必須區分TCP和UDP。 TCP是面向連接的,UDP不是。
當您想要接收任何通常綁定到IN_ADDRANY和特定端口的套接字時。對於TCP,你會做一個監聽,併爲UDP一個recfrom。
最具體的事情將用於匹配。因爲您也可以綁定到特定的IP地址。在這種情況下,檢查傳入消息的目標IP地址和端口。如果有人正在監聽該IP地址和該端口(recfrom或listen),那麼將使用該套接字。如果找不到具體的人,則使用IN_ADDRANY來查找匹配。 如果您始終綁定到IN_ADDRANY,則不能讓2個UDP套接字執行recocket並將套接字綁定到同一端口,也不能在同一端口上有偵聽TCP套接字。
對於UDP,討論在此結束。
對於TCP而言,事情更復雜。 從端口A開始監聽套接字。此時,系統上只有一個套接字使用端口A. 現在,連接由正在連接的客戶端建立。監聽套接字被克隆在一個以accept方式返回的服務套接字中。該套接字不在監聽狀態!!!但它仍在使用端口A. 由於它不是偵聽套接字,TCP不會使用它來匹配傳入的連接請求,因此它只使用偵聽套接字。爲了匹配傳入的數據,它使用連接對的概念。哪一個是你自己的IP地址和端口,在這種情況下是A,以及源IP地址和端口。這4個參數唯一地標識了與以上答案非常不同的連接,它似乎聲稱套接字由5個參數唯一標識,它實際上是由4個參數標識的TCP連接。 因此,在連接之後,您的系統基本上都有兩個都使用端口A的套接字。一個監聽套接字和一個服務套接字。 建立的連接越多,將分配的服務套接字越多,並且使用相同端口的套接字越多。當然,如果連接關閉,那麼它們會再次消失。
我希望這能澄清一些事情。結論是,TCP連接由4個參數標識,而偵聽TCP套接字僅由2個標識.TCP連接完全與彼此隔離,當然也來自偵聽套接字,這個連接僅用於建立連接並處理非常先有TCP SYN消息。
對不起,冗長的答案和複雜性。一旦你理解它,它確實很簡單。
SSH客戶端是否創建了一個帶有端口作爲套接字端口的新套接字?
不,它不會,客戶端連接到一個衆所周知的服務器端口,但使用臨時端口。除非客戶端將套接字綁定到知名端口,但這不是正常情況。
是否端口屬於SSH客戶端的插座,或過程的插座(如火狐),或SSH客戶端的兩個(即兩個插座和Firefox進程的插座使用同一端口港口)?
短暫的端口屬於客戶端,衆所周知的ssh端口屬於服務器進程。
服務器和客戶端之間的TCP連接由套接字對標識。這一對的一端在客戶機上,另一端在服務器機器上。
在這一點上我還沒有解決什麼其他問題?
的可能重複:通過[TCP兩個不同的插座共享一個端口?](http://stackoverflow.com/questions/11129212/tcp-two-different-sockets-sharing-a-port) – Downvoter
鏈接的螺紋評論沒有解決我的問題(至少直接)。 – Tim
很高興知道您是否只對TCP或UDP或兩者都感興趣。他們不完全一樣。然後還有UNIX套接字,我沒有在我的答案中解決。 –