Windows平台套接字TCP通信的问题

智能牛蛙 2020-05-26 07:08:14

我桌面的两个进程采用套接字进行进程间通信,用的是TCP协议,然后数据包是头部4字节(表示数据body大小)+ body
read函数每次先读取4个字节,然后这4个字节就能确定body的大小,再接着读取body长度的字节,大部分时候都工作得很好。



//伪代码
Packet{
BYTE head[4];
char *body;
uint length() { return head转换的整数; };
}

//read循环
while (1) {
Packet p;
int nRead = read(fd, p.head, ..4);
if (nRead == 4) {
uint length = p.length();
p.body = malloc(p.length());
int nRead = read(fd, p.body, ..length);
// handle body data
// free body
}
}




然而有的时候,read会出现读取头部4个字节后,并没有读完body长度的字节,read好像就返回了,然后下一次再读取4个字节时,读取的就是上一次body里面残留的字节,于是会得到错误的length(通常是几十亿。。。),引起malloc/new崩溃。

现在的问题是,怎样的情况会导致read还没读取完指定的字节数就返回,我记得linux中的signal信号会引起read返回?windows中呢?这个可能是因为调试的原因吗? 还是说代码本来就有问题,没有处理好所有Socket Tcp通信中的突然情况?



...全文
74 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
X-i-n 2020-05-26
  • 打赏
  • 举报
回复
粘包了,读完头4字节得到长度以后,开辟一个指定长度的buffer,一直读到buffer满,才算一个包结束,这时才能开始你的业务。 形如这样: (head)(bo dy)(head)(bod y) 应该在head后面读入定长的body才算完成读取。 另外,紧跟着的4个字节又是新的包了,需要进入新的业务逻辑。
aabbabababaa 2020-05-26
  • 打赏
  • 举报
回复
TCP通信代码啊,没搞过,学习一下

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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