解析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;
}
}
}
}
}