• 网络编程:流式套接字应用数据完整包读取问题


    本文接着上篇分包收包问题隶属同一个问题。今天刚遇到的问题并解决了,TCP协议传输,流式套接字编程,收取网络数据时,从缓冲数据中读取出应用层完整包,原来没有单个固定头长度的数据包取出bug表现,现在后来加入一个只有头的报文进入,于是整个取包就出现混乱。完整性再一次无法愈合。现在重新整理取包流程。msglen = recv(s, buffer, sizeof(buffer), 0); buf4packet 为存储完整数据包的临时数据缓冲区
    while(msglen>0)
    {
    	{
    		int len,szcpy;
    		len = (offset < sizeof(COMM_HEAD) ? sizeof(COMM_HEAD): ((COMM_HEAD*)buf4packet)->msg_len);
    		szcpy = len - offset;
    		szcpy = (msglen > szcpy ? szcpy:msglen);
    
    		memcpy(buf4packet + offset, buffer2, szcpy);
    		offset += szcpy;
    		buffer2 += szcpy;
    		msglen -= szcpy;
    		if (offset < sizeof(COMM_HEAD)) continue;
    		len = ((COMM_HEAD*)buf4packet)->msg_len;
    		if (offset <len) continue;
    		if (offset !=len)
    		{
    			xlog_out(LOG_COM,P_FATAL,"message_recv occur an error on packet completeness analyse!\n");
    			close(s);
    			break;
    		}
    	}
    	offset = 0;
    
    	COMM_HEAD* msg_p = NULL;
    	msg_p = message_parse(buf4packet);
    	if (msg_p != NULL)
    	{
    	……
    	}
    	……
    }
    
  • 相关阅读:
    从 i++ 和 ++i 说起局部变量表和操作数栈
    数据库连接情况查询相关sql语句
    db2相关语句
    BeanUtils源码详解
    Spring注解驱动开发之AOP
    Spring注解驱动开发之IOC
    正则表达式
    linux特殊符号
    linux下面如何让一个软件/命令开机自启动
    linux文件属性
  • 原文地址:https://www.cnblogs.com/qianwen36/p/3657434.html
Copyright © 2020-2023  润新知