[問題] socket相關的問題

看板C_and_CPP (C/C++)作者 (allen)時間14年前 (2011/12/31 01:11), 編輯推噓3(3021)
留言24則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Fedora 16 GCC 問題(Question): 想要用TCP做資料傳輸, 使用send()與recv()兩個函式, 但是執行有點問題, 發送端每次送出的大小並不固定, 而在接收的時候就會漏掉一些資訊 char buffer[1024]; int iResult, n; iResult = send(sock, buffer, n, 0); //n介於0~1024 iResult = recv(sock, buffer, 1024, 0); 兩邊都紀錄發送跟接收的值進行比較, 大概出現以下的情形 發送端 接收端 iResult = 5 5 1024 1024 1024 1024 798 424 70 70 1024 1024 1024 1024 1024 1024 1024 424 1024 1024 780 780 650 650 97 97 大概就是發現兩到三次發送塞滿1024byte的封包時, 接收端在下一次recv的時候, 只會固定收到424byte, 而沒有讀取到後面的資料, 想請問一下這是甚麼問題? 如果程式碼不夠詳細會再補上. 謝謝. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.255.117.233 ※ 編輯: allen7812 來自: 111.255.117.233 (12/31 01:11)

12/31 14:53, , 1F
n就直接設定為資料最大值會怎樣嗎0.0
12/31 14:53, 1F

12/31 15:08, , 2F
因為每次要送的資料量不一定 所以會依據讀檔的大小調整
12/31 15:08, 2F

12/31 15:13, , 3F
另外就是像我上面列出5個1024的封包時, recv也會漏掉..
12/31 15:13, 3F

01/01 02:46, , 4F
有CODE可以借來研究一番嗎..
01/01 02:46, 4F

01/01 12:11, , 5F
想要先改成一次recv一個byte, 再自己判斷封包有沒有結束
01/01 12:11, 5F

01/01 12:11, , 6F
之後有問題再上來請教
01/01 12:11, 6F

01/01 13:27, , 7F
是不是OSI模型實作的時候,每一層都有自己的 buffer,可能
01/01 13:27, 7F

01/01 13:28, , 8F
被下層的buffer斬斷了
01/01 13:28, 8F

01/01 14:11, , 9F
meconin你的意思是說我要去確認這個OS中關於OSU模型所提
01/01 14:11, 9F

01/01 14:11, , 10F
供的buffer大小之類的?
01/01 14:11, 10F

01/01 15:07, , 11F
不是,一般應該就如你在五樓的正解 XD 弄個 app header 描
01/01 15:07, 11F

01/01 15:08, , 12F
述該封包(application layer 看到的)長度,不夠就繼續收
01/01 15:08, 12F

01/01 15:10, , 13F
我是不確定封包會被截斷這個現象的原因,提出來問一下 XDD
01/01 15:10, 13F

01/01 15:12, , 14F
一般我看到的傳輸都是 [CMD] [ARG ...] [Length] [Data]
01/01 15:12, 14F

01/01 15:37, , 15F
嗯嗯 正在嘗試我寫在五樓的作法, 也可能考慮讓send也一
01/01 15:37, 15F

01/01 15:37, , 16F
個byte的大小傳
01/01 15:37, 16F

01/01 18:11, , 17F
問題已經解決了, 是因為對tcp的觀念不對才會出錯
01/01 18:11, 17F

01/01 18:13, , 18F
可以說說你是怎麼解決的嗎?
01/01 18:13, 18F

01/01 18:21, , 19F
因為我的觀念根本就錯了@@, send跟recv本來就不是成
01/01 18:21, 19F

01/01 18:23, , 20F
對的, send不一定能傳你指定的長度, recv也是一樣
01/01 18:23, 20F

01/01 18:24, , 21F
原來如此,感謝分享,這真的很容易搞錯...
01/01 18:24, 21F

01/01 18:24, , 22F
所以傳送跟接收都應該要用迴圈包起來, 再手動檢查發送
01/01 18:24, 22F

01/01 18:24, , 23F
跟接收到底處理了多少
01/01 18:24, 23F

01/01 19:40, , 24F
-_- SOCKET還真的很多問題咧..
01/01 19:40, 24F
文章代碼(AID): #1E_V2_QC (C_and_CPP)
文章代碼(AID): #1E_V2_QC (C_and_CPP)