2012-11-06 18 views
2
()函數實現

我在BSD代碼擡頭,但得到某處失去:(接受的Unix

我要檢查的理由是這樣的:

TCP RFC(http://www.ietf.org/rfc/rfc793.txt)秒2.7狀態:

「爲了在每個TCP中提供唯一的地址,我們將標識TCP的因特網地址與端口標識符連接起來,以創建一個在所有連接在一起的網絡中唯一的套接字,連接完全由兩端「。

這是否意味着:socket = local(ip + port)?

如果是,則Unix的accept函數返回一個新的套接字描述符。這是否意味着會創建一個新的套接字(反過來會創建一個新的端口)以響應客戶端請求?

PS:我是網絡編程的新手。

[更新]我明白我讀了什麼@How does the socket API accept() function work?。 我唯一的疑問是:如果socket =(本地端口+本地ip),那麼新的套接字將意味着同一個IP的新端口。通過這個邏輯,accept接受一個新的套接字(從而創建一個新的端口)。所以所有的發送應該通過這個新的端口發生。 我在這裏瞭解的正確嗎?

+0

'socket =(本地端口+本地IP)'已經是錯誤的。你的結論是基於一個錯誤的前提。 – EJP

回答

8

你基本上是正確的。當您accept()時,將創建一個新的套接字,並且偵聽套接字保持打開狀態以允許更多傳入連接,但新套接字使用與偵聽套接字相同的本地端口號。

連接由5元組:protocol,local-addr,local-port,remote-addr,remote-port定義。

因此,即使由於遠程IP /端口始終不同,它們都共享相同的本地端口號,所以每個接受的連接都是唯一的。監聽套接字沒有遠程IP /端口,因此也是唯一的。

+0

如果的確是一個套接字是IP +端口,那麼不應該有一個新的套接字必須有一個新的端口與它關聯? (sry無法提升你的低信譽分數的ur ans coz ...是一個新手) – user1801732

+1

@ user1801732這和你原來的問題是一樣的,這個問題的答案就是這個答案。 – hobbs

+2

接受的連接套接字**必須**具有與收聽套接字相同的端口號。如果它改變了,客戶端將無法知道新的值,並且初始TCP握手將失敗。 –