如题,这是我在写网络数据接收的时候想到的,在tcp/ip协议中,经常出现“粘包”的情况,就是前一个数据包的包尾同后一个数据包的包头一起接受到,需要把他们从缓冲区中取出。实际上就是给定一个应用层协议,比如
{
pkghead char;
pkglen int;
pkgdata char[100];
pkgend char;
}
要求从一段缓冲区中将该包取出。如何能通用的实现这个功能?比如每个程序的包结构都不同,或者同时需要识别多个协议。有没有通用的算法?谢谢!
{
pkghead char;
pkglen int;
pkgdata char[100];
pkgend char;
}
要求从一段缓冲区中将该包取出。如何能通用的实现这个功能?比如每个程序的包结构都不同,或者同时需要识别多个协议。有没有通用的算法?谢谢!
解决方案 »
- 9月14日15点28分 + 418小时20分 = 几月几日几点几分?
- 创建好的MFC工程,里面有菜单栏,现在想取消,怎样取消菜单栏呢?
- 招聘C++工程师
- 可用分发送,只限一人 900分
- 请教一个小问题:类?
- 想监视打印机的状态,类似于系统自带的'打印机和传真',如果没纸,上面会显示缺纸了,等等,看了N多方法,如使用GetPrinter等等,都不行~
- 怎么得到当前应用程序的名称.急......
- if(!totalmap.Lookup(caller,map_charge)) map_charge="";这句怎么解释?
- 讨厌在办公室吸烟的人进来拿分!!!
- 程序运行中如何改变显示器分辨率?
- WTL 带文本的进度条,哪位大侠可以提供源码!
- 我用CHTMLVIEW,如何在指定输入框输入内容,并点击按钮?
{
pkghead char;
pkgtype enum;
pkglen int;
pkgdata char[4]; //其实是一个指针,应用时可以扩展到几个结构
pkgend char;
}
同时需要识别多个协议.那么你的包头中第一个字节可以设置为协议类型,
从SOCKET中读取一个字节,判断出协议类型,
有了协议类型,那么包头长度也就有了,假设为N,
接下来读取N-1个字节,整个包头就有了,包头中应该有
有效载荷数据长度吧,假设为M,再读取M个字节,这样一个
完整包就有了,剩下的就循环吧。