解析Tcp协议包头

解析Tcp协议包头(包头:0x7R7R1E1E)

个人体会

首先tcp协议的数据传输是一个数据流,也就是像水管一样的,一头是我们的水井,一头是用水的人,比如我们想要500L水,这时候打开水龙头,水是通过水管流出来的,在需要很多水的时候,我们需要慢慢的接,不可能一下子就有我们的500L期望量。

代码

首先自己也是学习的情况下,写下自己的心得,有错误的望提出,互相提升。
下面展示一些 找头0x7R7R1E1E
下面展示一些 找头结构体信息

int FindNetHeader(char *buf,int len)
{
    int i=0;
    /*i<            len-4*/
    for(i = 0;i<len-4;i++)
    {
        if(memcmp(buf+i,"\x1e\x1e\x7r\x7r",4) == 0)/*注意大小端*/
        {
            break;
        }
    }
    return i;
}
int RecvTcpHeader(int socket_fd,Header head_std)
{
	int recvLen = 0;
	char recv_buff[128];
	memset(recv_buff,0,128);
	int head_len = sizeof(Header)/*Header 是你的定义tcp协议的头结构体*/
	int rtn;
	int whichHead;
	while(1)
	{
			rtn = recv(socket_fd,recv_buff+recvLen ,head_len -recvLen );/*因为可能你想接收head_len 长度,当实际没有,所以定义recvLen 循环接收*/
			if(rtn <= 0)
			{
				return 0;/*未接收到数据返回0*/
			}
			else
			{
				recvLen +=rtn ;/*循环接收直到接收到head_len */
				/*接收数据到recv_buff,开始找包头*/
				if(recvLen >= head_len )
				{
					whichHead = FindNetHeader(recv_buff,head_len )/*此函数在上面封装好了*/
					if(whichHead > 0)/*说明第一个字节不是头*/
	                {
	                    recvLen -= whichHead ;/*把前面错误的字节长度减掉,继续接收*/
	                    memmove(recvbuf,recvbuf+whichHead ,recvLen);/*recvbuf偏移掉错误的字节数,继续接收在recvbuf中*/
	                }
	                else//找到了头
	                {
	                    memcpy((char *)head_std,recv_buff,head_len);
	                    return recvLen;
	                }
				}
			}
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值