Re: [問題] socket寫活的

看板java作者 (十年一夢)時間10年前 (2013/11/19 14:18), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《Killercat (殺人貓™)》之銘言: : ※ 引述《LaPass (LaPass)》之銘言: : 不要用單純的raw socket, 稍微看一下TCP的listen/accept是怎麼實做的 : 去改一下TCP的實作方法 : Server端來說 : a TCP開一個socket port : b TCP等著這個socket port收訊息(listening) : c TCP收到Client訊息(accept), 開一個新的socket port並且告訴client該port : d TCP斷開該client連結 繼續listening, 新的socket port喂client資料 : Client端來說(分別對應上面的abcd) : a Client開一個socket port : b Client連結某個listening的TCP socket port : c 收到Server告訴你的接下來要跟誰接頭的port number : d 從該port number取得服務 : [略] 這一篇乍看之下有些不對勁,特別是 raw socket 這說法與作者在推文裡的回應。 不過作者想要表達的重點是:如果你無法在單一的串流裡同時妥善地處理屬於 command 與 data 的部分,可以考慮(類 FTP)把 command 與 data 分開在不同 的串流裡去傳輸。 的確這樣子對於使用 socket 串流來傳輸 command or data 的程式部分來說, 在實作上會比較單純。但是實作這種服務的 server 的複雜度提高很多,server 必須同時管理多個 server socket(one for command, others for data),以及 維護各個非 command 用途的 server socket 所管理的 socket 應在什麼時刻 輸出什麼 data 種種的細節。(走 HTTP protocol 都沒這麼複雜,概念上 HTTP 的 command 與 data 是在同一個串流上) 註:除非你把部分 burden 轉移到 client 去,client 要收 data 時要自己開 server socket 等 server site 去連接。在實務上這個要求能避免就避免,因為 這等於要求 client site 要有 global IP,不然就是要求 client 要能夠妥善 去處理 NAT 的設定。 要自定 Protocol 比較簡單的方式是去規範傳輸數據的 format 與 framing,讓 雙方對於任一次所傳輸的區塊中的那個子部分是哪種意義(包括 interpret 方式) 有相同的看法/做法;為了簡化單次傳輸所需要做的事情,而把概念上屬於一個 操作的事情拆成多個子操作 flow 來完成,我個人是覺得不妥,考慮到完整性與 效率,要實作好這樣的 server 是很不容易的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.235.231 ※ 編輯: sbrhsieh 來自: 218.173.235.231 (11/19 14:29)

11/19 15:51, , 1F
註的第一段我也是想到 FTP, 不過是 PORT 指令就是
11/19 15:51, 1F

11/19 15:53, , 2F
不過看看大家現在 PASV 用那麼多就知道這種做法現在不太好用
11/19 15:53, 2F

11/19 17:08, , 3F
在 NAT 下的情況太普遍了 xd
11/19 17:08, 3F
文章代碼(AID): #1IYmBDxs (java)
文章代碼(AID): #1IYmBDxs (java)