2013-12-18 68 views
1

請假設我們可以區分不同TCP連接的數據包,如果是這樣,那麼我們能否在服務器端的唯一套接字上接受多個TCP連接?我知道服務器綁定在一個套接字上,並且在接受新連接時爲新連接分配一個新套接字。我會覆蓋ACCEPT systemcall?在服務器上的唯一一個套接字上處理多個TCP連接

+0

所以,你想在服務器*一個*套接字接收來自所有連接的所有數據?就像爲UDP做的一樣?然後,在TCP中不可能,因爲它是一個連接的協議,每個連接都是一個獨立的實體。 –

+0

爲什麼?你提到的所有東西都已經由TCP完成了,並且每個接受的連接都以獨立套接字的形式完成。你爲什麼認爲你需要重新創建API? – EJP

+0

@ EJP。認爲我想用最小的延遲處理很多連接,所以最好是通過一個套接字來處理所有連接,而不是爲每個連接創建一個套接字,但ACCEPT systemcall爲每個接受的連接返回單獨的套接字。正因爲如此,我認爲我應該重寫ACCEPT systemcall! – MSH

回答

0

請假設,我們可以互相

區分不同的TCP連接的數據包你不能假設的。通過TCP連接應用程序不可見「數據包」。 TCP連接提供了一個字節流。你不能保證你讀的下一個東西會是一個消息頭,告訴你消息來自哪個客戶端。

+0

數據包邊界不可見,但addr,port信息是。沒有理由TCP套接字不能像UDP套接字一樣工作,從而提供「來自addr,port的下n個字節」,其中n是任意的(與UDP不同)。 – user1055568

+0

@ user1055568'addr.port'信息'通過TCP連接對應用程序不可見,而不是通過'getpeername()',它適用於套接字以及整個連接。我不知道你在說什麼。 – EJP

+0

我只是說這是伯克利套接字API的設計方式,與TCP協議是否定義應用程序級數據包邊界無關。 – user1055568

相關問題