Re: [問題] about win32 recv( )

看板C_and_CPP (C/C++)作者 (莉莉姆)時間16年前 (2009/10/31 23:20), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《neigence ()》之銘言: : HELLO : 最近在vc上開發socket通訊 使用到windows 的 : recv(SOCKET s, char* buffer,int bufferSize,int flag) : 想請問的有2個問題 : 1.假設server端丟某個訊息過來 , 而我client端用上述的recv來接受訊息 : 假如server丟的訊息長度高達1024byte,如果我沒有誤解的話 : recv是有可能收到500byte就返回的(未完整接受) : 這部分該如何解決呢? 我自已的想法是 : * 使用readline (如果系統沒有就自已包),而server丟的訊息會在結尾 : 加上\n。 你用recv()的話我假設你是使用tcp/ip來傳輸資料 tcp是stream類型的,所以不管發送端送的時候是怎麼樣, 本地端每次呼叫recv收到的資料就是無法預測的長度, 因此最簡單的方式就是發送端送資料的時候將屬於同一筆資料的長度資訊紀錄再 資料最開頭,接收端收到資料的時候只需要先收齊紀錄長度的資訊後接著再 按照長度等著接下來收齊屬於一整塊資料的大小後再處理, 再之後又是另一筆資料的長度資料再接著真實的資料...如此下去。 如果你全部都是用字串當作內容傳,可以利用結尾字元分隔就好。 : 2. 有沒有可能server連丟2個訊息,而我卻在一次recv中收到2個訊息? : 意即server send "aaa" 然後 send "bbb" 結果我一次recv就收到"aaabbb"? : 我是猜不太可能這樣... 不過我實在不確定 如果是tcp的話確實是會這樣的,但tcp會確保資料不會遺失並且與發送順序一致。 如果是udp的話則不會,但是收到順序卻不固定,或收不到(封包遺失了)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.37.95
文章代碼(AID): #1Ax5MxjG (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Ax5MxjG (C_and_CPP)