Re: [問題] 有關socket的寫法

看板C_and_CPP作者 (好人超)時間14年前 (2012/01/20 10:45), 編輯推噓4(401)
留言5則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《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

01/20 11:29, , 1F
非常謝謝您的指導~
01/20 11:29, 1F

01/20 12:52, , 2F
請問upd有保證嗎?
01/20 12:52, 2F
坦白說UDP我很少寫,不過印象中,幾次的sendto就會有幾次的recvfrom 如果我記錯了請糾正我 ※ 編輯: james732 來自: 117.19.117.152 (01/20 13:34)

01/20 21:43, , 3F
udp傳的東西有機會會不見
01/20 21:43, 3F

01/21 02:02, , 4F
UDP連順序都不保證 後送的可能先到
01/21 02:02, 4F

01/22 11:02, , 5F
建議也可以用換行符號 然後收端再去Parsing這樣~
01/22 11:02, 5F
文章代碼(AID): #1F6DLbfH (C_and_CPP)
文章代碼(AID): #1F6DLbfH (C_and_CPP)