socket通訊的雙方自己決定自己要用什麼埠,伺服器端只能決定自己listen的是哪個埠,不能決定客戶端的埠;客戶端也只能決定自己的埠,當然,因為它是主動連線的,所以它知道對方的埠號,但它也不能把對方的服務移到別的埠上面去。埠號是用來區分相同主機上的不同socket的,它相當於socket在本機這一端的名字,你去郵局寄信給別人,收件人總不能改你名字吧?客戶端實際上是可以為自己繫結一個特定的埠號的,只要在connect之前先進行bind就行了:
socket通訊的雙方自己決定自己要用什麼埠,伺服器端只能決定自己listen的是哪個埠,不能決定客戶端的埠;客戶端也只能決定自己的埠,當然,因為它是主動連線的,所以它知道對方的埠號,但它也不能把對方的服務移到別的埠上面去。埠號是用來區分相同主機上的不同socket的,它相當於socket在本機這一端的名字,你去郵局寄信給別人,收件人總不能改你名字吧?客戶端實際上是可以為自己繫結一個特定的埠號的,只要在connect之前先進行bind就行了:
但是一般來說沒有人實際這樣做,首先一個埠只能bind一次,佔用了之後同時就不能再給別人用了,這麼寶貴的資源都要留給listen的一方,主動連線的一方一般去用那些作業系統隨機分配的埠號。bind也可以指定埠號為0,這種情況下就是隨機繫結一個沒有使用過的埠號,可以用來在建立連線之前就確定本端的埠號。某些情況下還是有用的,設想某種網路環境下,我們需要在建立連線之前主動去申請防火牆透過,就可以考慮先進行bind,否則連線建立不起來(不過會有這麼傻的裝置嗎……)作為listen的一方,所有被動建立起來的連線的本端埠都是listen的埠。只有源IP、源埠、目的IP、目的埠還有協議號都完全相同才會認為是同一個socket,所以被動建立連線的socket源埠號不同,目的埠號是可以相同的。