Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1844436
  • 博文数量: 274
  • 博客积分: 2366
  • 博客等级: 大尉
  • 技术积分: 1880
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 09:37
文章分类

全部博文(274)

文章存档

2022年(1)

2020年(10)

2019年(7)

2018年(18)

2017年(26)

2016年(32)

2015年(43)

2014年(30)

2013年(44)

2012年(36)

2011年(17)

2010年(10)

分类: C/C++

2012-12-01 10:20:25

这是网上流传很广泛的TCP粘包处理代码: fd_set fdRead; timeval TimeOut; PACKHEADER *pHead = (PACKHEADER *)pBuffer; int ret, nLeft = 0, idx = 0; TimeOut.tv_sec = 0; TimeOut.tv_usec = TIMEOUT; FD_ZERO(&fdRead); FD_SET(m_sock, &fdRead); do { ret = ::select(0, &fdRead, NULL, NULL, &TimeOut); if (ret == SOCKET_ERROR) break; if (ret > 0) { if (nLeft == 0) ret = ::recv(m_sock, pBuffer, sizeof(PACKHEADER), 0); else ret = ::recv(m_sock, pBuffer + idx, nLeft, 0); if (ret == 0) //对方连接中断 ret = SOCKET_ERROR; if (ret == SOCKET_ERROR) break; if (nLeft == 0) nLeft = pHead->length; else nLeft -= ret; idx += ret; } else break; } while (nLeft > 0);

PACKHEADER
定义
struct PACKHEADER
{
char from[NAMELEN]; //发动端标识
char to[NAMELEN]; //接收端标识
int type; //包命令类型
int length; //包长度,
};

参考
阅读(1020) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~