2011-03-25 129 views
7

使用套接字API創建TCP客戶端時,本地主機上將使用端口連接到TCP服務器。TCP客戶端使用的端口連接到其他TCP服務器不可用的服務器

使用的端口似乎對另一個應用程序是不可用的,該應用程序是一個要綁定到服務器並充當服務器的TCP服務器。

由於用於客戶端的端口是動態確定的,它可能是我的應用程序想要用作服務器的端口。

TCP客戶端是否會動態地選擇要使用的端口並阻止其他程序成爲該端口上的服務器?

客戶端可以控制它使用什麼端口,以確保它不佔用另一個程序所需的端口嗎?

+0

你能告訴我們您所使用的語言。然後我們可以提供一個示例代碼。 – 2011-03-25 17:20:39

+0

嗨,我正在使用C – 2011-03-27 05:01:12

回答

8

確實TCP客戶端會動態地選擇一個端口來使用並阻止其他程序成爲該端口上的服務器?

是的,是的。

客戶端可以控制它使用什麼端口,以確保它不佔用另一個程序所需的端口嗎?

是的,你可以,但你不應該。使用綁定屬性。

OK ..繼承人的事情:

當你建立到服務器的連接,你打開一個socket端口大於1024的一點是,這將是一個高端口號。

你的服務器不應該打開一個大於1024的TCP端口。基本上你應該讓你的服務器運行在一個低端口。這就是所有http文件告訴我們的。

你也可以檢查一個端口是否已經被佔用,如果是,你可以在另一個端口打開你的服務器套接字。

+1

-1:您可以控制端口,並且實際範圍不要求大於5000。 Windows XP/2003例如默認使用範圍1025-5000。 – Erik 2011-03-25 17:15:53

+0

是的。當我意識到自己忘記了這一點時,我編輯了答案。但是你不應該那樣做,除非你對你可能導致的問題是正確的。 – 2011-03-25 17:17:03

+0

現在刪除downvote。 – Erik 2011-03-25 17:20:55

2

是的,端口將從一個預定義的範圍內選擇,該範圍從OS到OS有所不同,並被阻止用於其他用途。如果您需要,您可以選擇bind的特定端口。

編輯:

,你可以有綁定到相同的本地端口的多個TCP套接字的唯一情況/ IP是從時監聽套接字你accept()新的套接字。你永遠不能bind() TCP套接字到正在使用的端口/ IP。在SO_REUSEADDR上也有一些混淆,這個套接字選項不允許允許端口重用,它只是放鬆了規則,當只有死鎖的超時連接綁定到你想要的端口時。

-1

如果一個程序是正在監聽綁定在一個端口上我不相信別人也可以。通常,較低的端口被保留用於某些服務,例如端口80上的HTTP。如果您想要一個隨機端口,您應該生成一個高於1024的端口。對於常用端口列表,看看這裏:http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

編輯:從評論更正如下

+0

如果一個套接字正在監聽或不在,如果它綁定到一個端口,你就不能綁定一個新的無關套接字到同一個端口。 – Erik 2011-03-25 17:17:35