在SOCKET中Send两次,如果时间太近,则在服务器端Receive的时候一次就收下来了。我怎么能把它们分开呢?在线等,马上结。

killers100 2005-08-03 05:46:06
在SOCKET中Send两次,如果时间太近,则在服务器端Receive的时候一次就收下来了。我怎么能把它们分开呢?在线等,马上结。
...全文
910 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
killers100 2005-08-05
  • 打赏
  • 举报
回复
好,谢谢大家,再说声对不起,到现在才结帖。
junccc 2005-08-04
  • 打赏
  • 举报
回复
两次发送一定是有两次包头
不可能说就一个包头,所以你说的这种情况不可能的
你只要收到有包头的不就是又一次的数据?
killers100 2005-08-04
  • 打赏
  • 举报
回复
qrlvls(空 气) 老大的方法可以,不过我在自己的电脑试的时候可以,在别人的电脑上试不行,
setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
是不是传进去的bNodelay要先设置值啊???
netgm 2005-08-04
  • 打赏
  • 举报
回复
包头+数据+包尾..最好的办法啦
Wolfe 2005-08-04
  • 打赏
  • 举报
回复
学习
tangrh 2005-08-04
  • 打赏
  • 举报
回复
唉,这个问题不用讨论了,答案=tcp自己带包头确定数据长度(接收方先收包头)
包尾就不要了(Nagle算法只是说发送端协议栈不要攒包,如果不采用,哪怕一个字节,也立刻发出去,否则要等发送缓冲区里有一定数据或者过了一定时间才会发,因此它不会解决楼主的问题),呵呵,udp不会粘包,发一个,对方收一个(丢了就没有了,呵呵),因此不需要包头(唯一要注意的是不要超长,有很多讨论的,看看就知道了)
菲斯可儿 2005-08-04
  • 打赏
  • 举报
回复
典型的粘包现象。网上有很多讨论的。
killers100 2005-08-04
  • 打赏
  • 举报
回复
知道的再给点意见,,就要出DEMO版本了。。
快点啊。
killers100 2005-08-04
  • 打赏
  • 举报
回复
在MFC的CSocket类的子类里,构造函数中,设置:
this->setsockopt(TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
其中bNodelay=1;
结果是有时候能粘包,有时候不粘。而以前是肯定粘。
mymyal123 2005-08-03
  • 打赏
  • 举报
回复
学习
artmouse 2005-08-03
  • 打赏
  • 举报
回复
用分包方式,我是这样做的
西山小月 2005-08-03
  • 打赏
  • 举报
回复
典型的粘包现象。
采用应答方式吧。
softrain 2005-08-03
  • 打赏
  • 举报
回复
老老实实分析包头确定包长吧,这是正确的做法,不要走偏门.服务器端不能保证客户端都不使用negle算法.
就算一次recv到多个包,难道你根据包头信息还不能解析出这些包吗?晕
killers100 2005-08-03
  • 打赏
  • 举报
回复
谢谢大家,本来是准备下班前结帖的,
结果没找到答案,明天早上上班试了过后,如果可以就结帖。估计可以试试qrlvls(空 气) 老大的禁用Nagle 算法的方法。

我编的程序支持TCP和UDP。发的时候每个帧代表某些特定的命令或数据,其中头部有包含帧长度。本来以为收到的数据会是一帧一帧的,结果不是那么回事,希望能少改些代码,所以找可以减少修改代码的方法。
knowlove 2005-08-03
  • 打赏
  • 举报
回复
增加应答机制,发送端发送--接受端接收,当达到要求的量时候发出应答信号--发送端接受该信号继续发送
mango279 2005-08-03
  • 打赏
  • 举报
回复
用udp

tcp就会这样,或者一个大包拆成若干小包
qrlvls 2005-08-03
  • 打赏
  • 举报
回复
原因是Nagle算法会将多个小包集中成一个大包进行发送,你也可以增大包的大小,但这样对网络环境影响不好
qrlvls 2005-08-03
  • 打赏
  • 举报
回复
你可以禁用 Nagle 算法,不过最好还是在协议上保障
setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
qrlvls 2005-08-03
  • 打赏
  • 举报
回复
TCP 是流协议,不是消息协议,因此粘包是很正常的
通常是通过协议来区别两个包的
alon21 2005-08-03
  • 打赏
  • 举报
回复
定义结构,结构的头部带上数据的长度。
加载更多回复(7)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧