socket拼包发送

扬帆886 2009-04-24 09:35:23
请教下:tcp下select模式 发送接收缓冲设置的1K。
服务器线程:send包1:包长5,实际发送5
send包2:包长256,实际发送256
连续发送2包

客户机:

while(true)
{
FD_ZERO(&readfds);
FD_SET(m_hSocket,&readfds);
int ret = select(0,&readfds,NULL,NULL,&m_timeout);
if(ret == SOCKET_ERROR)
{
closesocket(m_hSocket);
return false;
}
else if(FD_ISSET(m_hSocket,&readfds))
{

int nRecv = recv(m_hSocket, m_szBuff, MAX_PACKET_SIZE, 0);

if(nRecv == 261)
{
int k =nRecv; //该行设置断点;
cout<<"error";
}
domything();
}
}

当客户端先后收到包1,包2时程序不进入断点,程序执行正常;
当tcp拼包发送时,客户端接收到261(包1+包2)字长的包,无法识别到消息包2,程序无限循环卡死。
我在服务器端发送包1后sleep下,程序当掉机率就小很多。请教下有什么彻底的解决办法没?


...全文
216 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
扬帆886 2009-04-24
  • 打赏
  • 举报
回复
恩 ,好的
谢谢指点。学习了
  • 打赏
  • 举报
回复
连续2次send,客户机的recv就会挂.

这是粘包的处理了,看看这里
http://www.cnblogs.com/wzd24/archive/2007/12/24/1011932.html
jame2001 2009-04-24
  • 打赏
  • 举报
回复
自己分析 m_szBuff 裡面的資料吧..
每包加上個檔頭標明資料大小....
taodm 2009-04-24
  • 打赏
  • 举报
回复
tcp要自己在接收端拼拆包的。包2也可以分成N次发过来的。
所以,你发送时,数据头部必须自己携带包长,然后据此拼拆包。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧