2012-07-12 35 views
1

我有幾個基本問​​題:插座,其屬性和SO_REUSEADDR選項

1.A插座通過協議,本地IP,本地端口,遠程IP和遠程端口表示。假設客戶端和服務器之間存在這種連接。現在,當我綁定另一個客戶端到相同的本地端口和IP,它已綁定(我使用SO_REUSEADDR),但連接操作由第二個客戶端到相同的遠程IP和端口失敗。所以,是沒有辦法第三個進程可以共享相同的套接字?

2.當我們在綁定到本地端口和ip的套接字上調用listen()時,它會監聽連接。當客戶端連接時,它會創建一個套接字(比如說A)。它完成3次握手,然後啓動一個不同的套接字(比如說B)並刪除套接字A(Source)。新客戶端由新套接字B處理。因此,什麼樣的套接字代表了一個監聽socket即什麼是遠程IP和端口,是套接字A不同於該套接字或只是遠程IP和端口添加到偵聽套接字形式A?

3.I讀取SO_REUSEADDR在端口上建立一個監聽套接字,如果沒有套接字監聽端口和IP和端口和IP,在所有插座上都SO_REUSEADDR選項設置。但後來我也遇到一個文本說,如果一個客戶端綁定到一個端口和IP,另一個客戶端無法綁定到它(即使使用SO_REUSEADDR),除非第一個客戶端成功調用connect()。有沒有監聽套接字(它是一個客戶端,所以我們沒有電話連接())在該端口和ip 在這個例子。那麼,爲什麼不允許另一個客戶端?

在此先感謝。

回答

1
  1. 正確:無法用相同的協議,本地端口,本地地址,遠程端口和遠程地址創建兩個不同的套接字。沒有什麼可以告訴哪些數據包屬於哪個套接字!

  2. 偵聽套接字沒有遠程地址和遠程端口。沒關係,因爲與此套接字關聯的線路上沒有數據包(尚未)。實際上,所有套接字都從本地或遠程地址或端口開始。這些屬性僅在bind()(用於本地)和connect()/accept()(用於遠程)被調用時纔會分配。

  3. 直到您在套接字上調用connect()listen(),服務器(偵聽)或客戶端套接字之間沒有任何區別。他們是一樣的東西。因此,在這裏更準確地說,如果兩個套接字都沒有遠程地址或端口,則不允許共享相同的協議,本地地址和本地端口。

    儘管這在實際中並不是問題,因爲您通常不會在客戶端套接字上調用bind(),這意味着在connect()時間內臨時端口存在隱式bind()。這些典型的客戶端套接字不能與偵聽套接字發生衝突,因爲它們不具有與其關聯的地址,而是具有與之關聯的本地和遠程地址,從而跳過僅具有本地地址的狀態。