Re: [問題] socket寫活的
※ 引述《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
11/19 15:51, 1F
→
11/19 15:53, , 2F
11/19 15:53, 2F
→
11/19 17:08, , 3F
11/19 17:08, 3F
討論串 (同標題文章)
完整討論串 (本文為第 4 之 4 篇):
問題
2
14