社区
网络编程
帖子详情
这个问题一直捆扰我很久了
yhlovehx
2005-03-23 08:09:48
关于socket的啊
就是说服务器端 连续发送 几个数据包 怎样才能让客户端接受同样多个数据包
我现在就是这样 服务器发送的几个包 有时候客户端 是一起的接受的 不好分析啊
希望各位神仙指点
...全文
190
9
打赏
收藏
这个问题一直捆扰我很久了
关于socket的啊 就是说服务器端 连续发送 几个数据包 怎样才能让客户端接受同样多个数据包 我现在就是这样 服务器发送的几个包 有时候客户端 是一起的接受的 不好分析啊 希望各位神仙指点
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xuzheng318
2005-03-24
打赏
举报
回复
帮楼主顶!关注!
老开山
2005-03-24
打赏
举报
回复
up
sjcode
2005-03-24
打赏
举报
回复
楼上说的没错,加上长度就可以按两次recv数据了。消息定义如下:
typedef struct DATAHEAD
{
unsigned int MsgLen;
unsigned int CommandID;
unsigned int Version;
}DATAHEAD;
第一次recv时,首先读取这12个字节.
DATAHEAD dataHead;
memset(dataHead,0,sizeof(DATAHEAD));
if(recv(sock,dataHead,sizeof(DATAHEAD))!=12)
//sock已断
int iMsgLen = ntohl(dataHead->MsgLen);
然后通过这个iMsgLen,再次recv,即可得到你想要的数据
yhlovehx
2005-03-24
打赏
举报
回复
回复“keikey_xi”的
因为我做的是模拟器啊 所以你的办法没用哦
不过“Caps77” 的文章 对我蛮有帮助
谢谢大家啊
keikey_xi
2005-03-24
打赏
举报
回复
你应该自已定义协议,也就是说,为每个数据包加一个包头,里面包含了包长度。这样你在客户端接收到包时,按照包头中规定的长度去取就可以了。TCP在底层对你来说是透明的,你无需管它。
whtech
2005-03-24
打赏
举报
回复
.
yhlovehx
2005-03-24
打赏
举报
回复
你们那些都是建立在服务器和客户端 都是自己做的啊
我现在做的是模拟器啊 并不知道服务器的传输方法啊
Caps77
2005-03-23
打赏
举报
回复
粘包问题:
一、TCP协议简介
TCP是一个面向连接的传输层协议,虽然TCP不属于ISO制定的协议集,但由于其在商业界和工业界的成功应用,它已成为事实上的网络标准,广泛应用于各种网络主机间的通信。
作为一个面向连接的传输层协议,TCP的目标是为用户提供可靠的端到端连接,保证信息有序无误的传输。它除了提供基本的数据传输功能外,还为保证可靠性采用了数据编号、校验和计算、数据确认等一系列措施。它对传送的每个数据字节都进行编号,并请求接收方回传确认信息(ACK)。发送方如果在规定的时间内没有收到数据确认,就重传该数据。数据编号使接收方能够处理数据的失序和重复问题。数据误码问题通过在每个传输的数据段中增加校验和予以解决,接收方在接收到数据后检查校验和,若校验和有误,则丢弃该有误码的数据段,并要求发送方重传。流量控制也是保证可靠性的一个重要措施,若无流控,可能会因接收缓冲区溢出而丢失大量数据,导致许多重传,造成网络拥塞恶性循环。TCP采用可变窗口进行流量控制,由接收方控制发送方发送的数据量。
TCP为用户提供了高可靠性的网络传输服务,但可靠性保障措施也影响了传输效率。因此,在实际工程应用中,只有关键数据的传输才采用TCP,而普通数据的传输一般采用高效率的UDP。
二、粘包问题分析与对策
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据(图1所示)。
粘包情况有两种,一种是粘在一起的包都是完整的数据包(图1、图2所示),另一种情况是粘在一起的包有不完整的包(图3所示),此处假设用户接收缓冲区长度为m个字节。
不是所有的粘包现象都需要处理,若传输的数据为不带结构的连续流数据(如文件传输),则不必把粘连的包分开(简称分包)。但在实际工程应用中,传输的数据一般为带结构的数据,这时就需要做分包处理。
在处理定长结构数据的粘包问题时,分包算法比较简单;在处理不定长结构数据的粘包问题时,分包算法就比较复杂。特别是如图3所示的粘包情况,由于一包数据内容被分在了两个连续的接收包中,处理起来难度较大。实际工程应用中应尽量避免出现粘包现象。
为了避免粘包现象,可采取以下几种措施。一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。
以上提到的三种措施,都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包。第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。
一种比较周全的对策是:接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开。对这种方法我们进行了实验,证明是高效可行的。
三、编程与实现
1.实现框架
实验网络通信程序采用TCP/IP协议的Socket API编程实现。Socket是面向客户机/服务器模型的。TCP实现框架如图4所示。
2.实验硬件环境:
服务器:Pentium 350 微机
客户机:Pentium 166微机
网络平台:由10兆共享式HUB连接而成的局域网
3.实验软件环境:
操作系统:Windows 98
编程语言:Visual C++ 5.0
4.主要线程
编程采用多线程方式,服务器端共有两个线程:发送数据线程、发送统计显示线程。客户端共有三个线程:接收数据线程、接收预处理粘包线程、接收统计显示线程。其中,发送和接收线程优先级设为THREAD_PRIORITY_TIME_CRITICAL(最高优先级),预处理线程优先级为THREAD_PRIORITY_ABOVE_NORMAL(高于普通优先级),显示线程优先级为THREAD_PRIORITY_NORMAL(普通优先级)。
实验发送数据的数据结构如图5所示:
5.分包算法
针对三种不同的粘包现象,分包算法分别采取了相应的解决办法。其基本思路是首先将待处理的接收数据流(长度设为m)强行转换成预定的结构数据形式,并从中取出结构数据长度字段,即图5中的n,而后根据n计算得到第一包数据长度。
1)若n2)若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。
3)若n>m,则表明数据流内容尚不够构成一完整结构数据,需留待与下一包数据合并后再行处理。
对分包算法具体内容及软件实现有兴趣者,可与作者联系。
四、实验结果分析
实验结果如下:
1.在上述实验环境下,当发送方连续发送的若干包数据长度之和小于1500B时,常会出现粘包现象,接收方经预处理线程处理后能正确解开粘在一起的包。若程序中设置了“发送不延迟”:(setsockopt (socket_name,IPPROTO_TCP,TCP_NODELAY,(char *) &on,sizeof on) ,其中on=1),则不存在粘包现象。
2.当发送数据为每包1kB~2kB的不定长数据时,若发送间隔时间小于10ms,偶尔会出现粘包,接收方经预处理线程处理后能正确解开粘在一起的包。
3.为测定处理粘包的时间,发送方依次循环发送长度为1.5kB、1.9kB、1.2kB、1.6kB、1.0kB数据,共计1000包。为制造粘包现象,接收线程每次接收前都等待10ms,接收缓冲区设为5000B,结果接收方收到526包数据,其中长度为5000B的有175包。经预处理线程处理可得到1000包正确数据,粘包处理总时间小于1ms。
实验结果表明,TCP粘包现象确实存在,但可通过接收方的预处理予以解决,而且处理时间非常短(实验中1000包数据总共处理时间不到1ms),几乎不影响应用程序的正常工作。
Hendy_So
2005-03-23
打赏
举报
回复
收发的缓冲区大小匹配就可以了。
-转载-我要我们在一起故事原著
转载《和我十年长跑的女孩就要嫁人了》 读别人的故事哭得不能自已的是自己,我要我们在一起。 本文转载自豆瓣,纯属喜欢,非商用。 ★★★★★★★★★★★★★★★★★★★★ 原文地址: 豆瓣:...
C 语言常见
问题
集
C 语言常见
问题
集原著:SteveSummit翻译:朱群英,孙云修订版0.9.4,2005年6月23日版权所有c. 2005 目录目录 i 前言 xvii 1 声明和初始化 1 1.1 我如何决定使用那种整数类型?................... 11.264位机上的...
程序之外_与我长跑十年的女朋友嫁人了(转)
一个爱情故事,这个故事很长,但是绝对会触动你内心的很多东西…… 昨天下午凌一尧给我发来一张照片,是一件婚纱,她问好不好看,我说还行。 她说“初五举办婚礼,和我们以前想象得一样,有鲜花拱门,有红地毯,有...
wps 英文版_为什么现在我会推荐使用wps?
推荐起因事情的起因还是因为我自己前几日把电脑系统重置了,清理得干干净净的,连XX版的office...灵感来自于一位朋友——葫芦娃,当然这是他的“艺名”,让我甩掉了
一直
使用破姐版的office。在他的推送消息中,我了...
左撇子的成长指南:我是左撇子.TXT
确切地说,我曾经是左撇子,而现在已经被改造了——我这一代(我生于1958年)的大多数左撇子的经历都是如此。 以往我常常会这样说:除了写字以外,我能用左手做所有的事(虽然事实并非如此)。其实,更准确的...
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章