tcp服务器组包
2015-08-06 18:15
513 查看
// 协议格式 struct Header { int hflag =0xffffffff ; int htype ; int plength ; }; struct Test { Header head; string data; }; const static int FLAGG = 0xffffffff; const static int MAX_LEN = 65536; virtual void onRead(ssize_t nread, char* buf) { static char tmp[MAX_LEN]; static int index = 0; int intLen = sizeof(int); // 缓存数据不完整,收到新的包头 if (index > 0 && nread > intLen * 3 && memcmp(buf, (void*)&FLAGG, sizeof(FLAGG)) == 0) { std::cout << *(int*)(tmp + intLen) << "类型不完整" << std::endl; memset(tmp, 0, MAX_LEN); index = 0; } for (int i = 0; i < nread && index < MAX_LEN; ++i) { if (index == intLen && memcmp(tmp, (void*)&FLAGG, sizeof(FLAGG)) != 0) { std::cout << *(int*)(tmp) << "非法包头" << std::endl; memset(tmp, 0, MAX_LEN); index = 0; return; } else if (index == intLen * 3 && (*(int*)(tmp + intLen * 2) < index || *(int*)(tmp + intLen * 2) > MAX_LEN)) { std::cout << *(int*)(tmp + intLen) << "长度非法" << std::endl; memset(tmp, 0, MAX_LEN); index = 0; return; } else { tmp[(index)++] = buf[i]; } if (index >= intLen * 3 && *(int*)(tmp + intLen * 2) == index) { showPackage(tmp); memset(tmp, 0, MAX_LEN); index = 0; } } }
协议格式:
相关文章推荐
- 网络通信之Socket与LocalSocket的比较
- jgraphx中语言文件配置
- http://www.blogjava.net/zJun/archive/2006/06/28/55511.html
- IdTCP的C++Builder2010示例(转)
- Java网络爬虫
- hdu 4039 2011成都赛区网络赛I ***
- TCP为何采用三次握手来建立连接,若采用二次握手可以吗?
- volley Android or java https ssl exception
- TCP三次握手和四次挥手协议
- iOS -读书笔记-网络请求
- Android Http请求框架二:xUtils 框架网络请求
- Android Http请求框架一:Get 和 Post 请求
- ASIHttpRequest 使用
- Android面HTTP协议发送get要求
- 【python网络编程】利用select实现socket全双工异步通信
- Android网络请求工具类
- 欢迎使用CSDN-markdown编辑器
- HTTP协议详解
- 怎样使用NetFlow分析网络异常流量一
- Linux IO多路复用之epoll网络编程(含源码)