作者james732 (好人超)
看板C_and_CPP
標題Re: [問題] 有關socket的寫法
時間Fri Jan 20 10:45:55 2012
※ 引述《rmp4aup6 (嘿嘿)》之銘言:
: 我是用TCP的方式沒錯,
: 我大概講一下我的程式目的的架構,
: 目的是server會下command給client,並使client的執行結果給server,
: 例如 server的command為 "ls -l",之後client就必須把結果給server,
: 目前卡關在client端,要如何一筆一筆去接收呢?
: 目前client只接收第一筆資料而已,抱歉打擾各位了。
因為 tcp 的性質,並不保證一個 send 就會對應一個 recv
如果你的傳送端這樣寫
send("ls -l");
send("command2");
send("command3");
接收端的recv有可能只回傳一次,一口氣收到
"ls -lcommand2command3"
這樣一串的東西
當然也可能recv回傳兩次,變成
"ls -lcomma"
"nd2command3"
recv會收到多長的東西,是我們不可預期的
因此recv的回傳值非常重要,也是寫socket程式常常出問題的地方..XD
所以直接把recv的結果拿去執行,應該會出問題
解決的方式就像推文說的,你要連command的長度也一起傳
send(strlen("ls -l")); // 先送長度
send("ls -l"); // 再送command
recv就可以先收到command的長度
正確的還原這個command後再去執行
嚴格說起來,要傳長度應該還要用 htonl 之類的函式轉一下
在接收端用 ntohl 轉回來
畢竟沒辦法保證兩端的 endian 是一樣的
不過如果都是 x86-windows 系統的話,這個步驟可以偷懶一下
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 117.19.117.152
推 rmp4aup6:非常謝謝您的指導~ 01/20 11:29
→ ADF:請問upd有保證嗎? 01/20 12:52
坦白說UDP我很少寫,不過印象中,幾次的sendto就會有幾次的recvfrom
如果我記錯了請糾正我
※ 編輯: james732 來自: 117.19.117.152 (01/20 13:34)
推 jim221:udp傳的東西有機會會不見 01/20 21:43
推 littleshan:UDP連順序都不保證 後送的可能先到 01/21 02:02
推 mingcloud:建議也可以用換行符號 然後收端再去Parsing這樣~ 01/22 11:02