在SOCKET中Send两次,如果时间太近,则在服务器端Receive的时候一次就收下来了。我怎么能把它们分开呢?在线等,马上结。 在SOCKET中Send两次,如果时间太近,则在服务器端Receive的时候一次就收下来了。我怎么能把它们分开呢?在线等,马上结。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般使用都要自己定义一个结构,如:开头为5字节"start",后面包长度,最后的为结尾符号等这样就可以在buf中找到开头,然后按长度读,最后再对比一下结尾符号就可以区分了。 TCP接收的次数跟发送的次数没有关系,也不是两次发送的时间太近就会一次接收完毕,是recv中的接收参数以及队列里的数据量决定的 看看下面的代码吧,对你很有用:http://www.vczx.com/article/show.php?id=1041 TCP是包含拥塞控制机制的 不该出现你的情况 TCP 是流协议,不是消息协议,因此粘包是很正常的通常是通过协议来区别两个包的 你可以禁用 Nagle 算法,不过最好还是在协议上保障setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay)); 原因是Nagle算法会将多个小包集中成一个大包进行发送,你也可以增大包的大小,但这样对网络环境影响不好 用udptcp就会这样,或者一个大包拆成若干小包 谢谢大家,本来是准备下班前结帖的,结果没找到答案,明天早上上班试了过后,如果可以就结帖。估计可以试试qrlvls(空 气) 老大的禁用Nagle 算法的方法。我编的程序支持TCP和UDP。发的时候每个帧代表某些特定的命令或数据,其中头部有包含帧长度。本来以为收到的数据会是一帧一帧的,结果不是那么回事,希望能少改些代码,所以找可以减少修改代码的方法。 老老实实分析包头确定包长吧,这是正确的做法,不要走偏门.服务器端不能保证客户端都不使用negle算法.就算一次recv到多个包,难道你根据包头信息还不能解析出这些包吗?晕 qrlvls(空 气) 老大的方法可以,不过我在自己的电脑试的时候可以,在别人的电脑上试不行,setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));是不是传进去的bNodelay要先设置值啊??? 在MFC的CSocket类的子类里,构造函数中,设置:this->setsockopt(TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));其中bNodelay=1;结果是有时候能粘包,有时候不粘。而以前是肯定粘。 知道的再给点意见,,就要出DEMO版本了。。快点啊。 唉,这个问题不用讨论了,答案=tcp自己带包头确定数据长度(接收方先收包头)包尾就不要了(Nagle算法只是说发送端协议栈不要攒包,如果不采用,哪怕一个字节,也立刻发出去,否则要等发送缓冲区里有一定数据或者过了一定时间才会发,因此它不会解决楼主的问题),呵呵,udp不会粘包,发一个,对方收一个(丢了就没有了,呵呵),因此不需要包头(唯一要注意的是不要超长,有很多讨论的,看看就知道了) C++类头文件出现二义性 sql类型? 应答式服务器如何建立! [散分]AfxMessageBox也遇断言错 大虾们有时用英文版VC的进来看看 多选文件时,文件名的得到? 在我的机器中用debug命令 如何在一个函数外访问这个函数的内部变量 如何去灰化窗口的最大化按钮?解决就给分! 谁有ping的源码??? 谁有牌类游戏代码,我在学编游戏 一个MFC界面的虫级问题!!@跪求~
这样就可以在buf中找到开头,然后按长度读,最后再对比一下结尾符号就可以区分了。
http://www.vczx.com/article/show.php?id=1041
通常是通过协议来区别两个包的
setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
结果没找到答案,明天早上上班试了过后,如果可以就结帖。估计可以试试qrlvls(空 气) 老大的禁用Nagle 算法的方法。我编的程序支持TCP和UDP。发的时候每个帧代表某些特定的命令或数据,其中头部有包含帧长度。本来以为收到的数据会是一帧一帧的,结果不是那么回事,希望能少改些代码,所以找可以减少修改代码的方法。
就算一次recv到多个包,难道你根据包头信息还不能解析出这些包吗?晕
setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
是不是传进去的bNodelay要先设置值啊???
this->setsockopt(TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
其中bNodelay=1;
结果是有时候能粘包,有时候不粘。而以前是肯定粘。
快点啊。
包尾就不要了(Nagle算法只是说发送端协议栈不要攒包,如果不采用,哪怕一个字节,也立刻发出去,否则要等发送缓冲区里有一定数据或者过了一定时间才会发,因此它不会解决楼主的问题),呵呵,udp不会粘包,发一个,对方收一个(丢了就没有了,呵呵),因此不需要包头(唯一要注意的是不要超长,有很多讨论的,看看就知道了)