看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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