2011-07-20 52 views
1

我正在做一些C編程的客戶端服務器套接字示例。 可以說服務器偵聽Port80,端口4321上的客戶端。該元組用於區分多個連接。但是,服務器如何區分來自同一客戶端的連接?我的意思是肯定會有來自客戶端的多個應用程序訪問同一端口上的同一臺服務器。服務器如何區分來自單個客戶端的多個連接?

任何人都可以解釋一下嗎?

謝謝

+0

對於HTTP,服務器bind()到端口80和listen()以及客戶端connect()到服務器,自動綁定到一個隨機的臨時端口。 – ninjalj

回答

3

兩個客戶端不能使用相同的端口。如果一個客戶端使用端口4321,另一個客戶端必須使用不同的端口。

+0

一個客戶端可以使用多個端口,服務器如何區分它們? –

+0

OP將單詞「客戶端」的含義混淆爲一臺計算機與一個進程。您需要在OP瞭解您的答案之前解決此問題... –

1

兩個客戶端不能使用相同的端口,所以沒有意義。

但是,如果您要定義自己的協議,爲什麼不在客戶端和服務器之間來回傳遞ClientID?客戶端可以使用無效的client_id發出請求,服務器可以在確認中分配一個請求。

2

連接由元組(協議,源IP,源端口,目標IP,目標端口)標識。這就是你如何區分連接的方法。

3

正常的答案是,你只是不這樣做的第一個地方。

客戶端通常會連接到一個服務器,該服務器有一個未綁定的套接字,這意味着它沒有指定接收回復的本地端口。服務器將使用bind來指定本地端口,然後它將在該端口上偵聽來自客戶端的連接。

當客戶端連接到一個未綁定的套接字時,這意味着TCP堆棧將選擇一個當前未使用的端口號,並將其分配給該連接。當它向服務器發送請求時,服務器將在已分配的端口號上回復。在客戶端,TCP堆棧將查看數據包中的端口號,並將其路由到分配了該端口號的任何進程。

因此,客戶端不會使用端口4321 - 它將使用堆棧分配給它的任何端口。當同一臺計算機上的另一個進程連接到同一臺服務器時,它不會使用端口4321 - 它將使用另一個端口分配給它。網絡堆棧負責確保每個端口都有唯一的端口號。

爲了什麼值得,TCP端口分爲三個範圍。從0到1023是諸如FTP,SMTP,HTTP,POP等服務器的「衆所周知」端口。這些端口用於服務器使用,並且操作系統可能會採取一些特殊步驟來保護這些服務器。例如,在Windows上(運行Windows防火牆)

1024到49151是註冊的端口號。這些通常比衆所周知的端口更鬆散地控制。幾乎任何人都可以開始傾聽他們的意見,但IANA爲特定的端口維護一個特定目的的註冊表。根據註冊表,端口4321用於遠程whois協議。

從49152到65535是動態端口 - 當客戶端連接到服務器時,通常會在此範圍內獲得本地端口號。當然,您可以編寫一個服務器,並將其綁定到此範圍內的端口號(如果您願意)(例如,用於測試)。當/如果你這樣做,堆棧會跟蹤它,所以它不會嘗試將該端口用於其他目的。

1

TCP Listener端口基於套接字區分連接,該套接字是IP地址爲的IP端口。

對於客戶端多次連接到同一臺服務器,從同一臺機器,它使用多個端口(通常是短暫的)到同一個已知(偵聽器)端口。

然後,服務器在連接套接字上迭代,這可能包括來自同一臺機器甚至應用程序的多個連接。

當您使用connect()TCP函數時,客戶端端口綁定由操作系統自動完成,因此您並不需要管理這些東西。

然後服務器通過IP:端口(可能仍然在同一個應用程序)的不同組合將數據發送到客戶端,所以它不能混淆。

相關問題