标题:没分了,但是帮忙看看,Socket 用 recv()接收结构体数据不完整问题
只看楼主
wtw199186
Rank: 2
等 级:论坛游民
帖 子:55
专家分:78
注 册:2012-9-22
结帖率:57.14%
已结贴  问题点数:6 回复次数:11 
没分了,但是帮忙看看,Socket 用 recv()接收结构体数据不完整问题
定义了一个结构体,发现服务器端向客户端发送数据时,客户端接收到的数据有时候会少于发送端发送的字节数,我结构体大小为248字节,但是接收端有时会受到220和28个字节的情况,接收的buffer足够大,刚学习这方面,请大侠们指点一下
搜索更多相关主题的帖子: Socket 服务器 结构体 客户端 
2014-05-02 09:16
fragileeye
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:107
专家分:387
注 册:2011-5-21
得分:2 
你用tcp还是udp?说清楚!目测是tcp,流式的,没有消息边界。这很正常,没谁要求流式传输会一下传输完整。好好看书。
2014-05-02 14:12
wtw199186
Rank: 2
等 级:论坛游民
帖 子:55
专家分:78
注 册:2012-9-22
得分:0 
回复 2 楼 fragileeye
谢谢你的回复,我的确是用的TCP,我想问问,如果对方发送的结构体数据还没有完整的送到我接收端,那么我的接收端recv()函数怎么就可以得到那部分不完整的数据,是不是发送端即使没有将一个完整的结构体数据发送过来,我接收端也可以接收到已经发送的那部分不完整的数据,如果我想正确得到数据,是不是要将接收到的不完整的那两部分数据拼接在一块,组成的就是完整结构体数据?
2014-05-02 15:31
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
得分:2 
理解正确。直到 recv() 返回值为0时才算是一次接收完成。


[ 本帖最后由 top398 于 2014-5-2 23:39 编辑 ]
2014-05-02 23:38
wtw199186
Rank: 2
等 级:论坛游民
帖 子:55
专家分:78
注 册:2012-9-22
得分:0 
回复 4 楼 top398
谢谢
2014-05-03 00:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:2 
怎麽能夠靠這種方法做數據通訊呢,數據接著數據,憑什麽這個數據後面就沒有數據再進來,一定有零的麽。

授人以渔,不授人以鱼。
2014-05-03 00:50
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
得分:0 
以下是引用TonyDeng在2014-5-3 00:50:34的发言:

怎麽能夠靠這種方法做數據通訊呢,數據接著數據,憑什麽這個數據後面就沒有數據再進來,一定有零的麽。
按楼主的意思是只接收一个结构体,因此这样无妨。当然服务器最好在发送一个结构体后,就 closesocket/shutdown。更多数据的情况下,就需要服务器与客户端预先协商,究竟要传送多少数据?
2014-05-03 01:15
fragileeye
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:107
专家分:387
注 册:2011-5-21
得分:0 
ps:结构体传输,虽然我以前做的时候没有定义传输字段大小,但这是不严格的。
不要依赖协议为你提供的保证,写代码越谨慎,调试越轻松。

re:是否接受完整,可以通过recv的返回信息判断的。一般recv一次性接受一个不大的结构体,是可以满足的。

强烈建议参考ps内容。
2014-05-04 10:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
當然要做收發溝通協議,發送什麽數據,需要如何接收,有個約定的信號,先發過去提醒接收方要做什麽動作,然後才發送,大家都按協議執行,不是僅靠TCP/IP通訊就可以搞定的。

授人以渔,不授人以鱼。
2014-05-04 11:04
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
得分:2 
数据包分片了吧
2014-05-04 11:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-430913-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.309937 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved