socket数据报解析

  记得以前总是对socket数据包解析很糊涂,相信也有很多人对此有疑惑。下面简单用C语言来解释如何解包。懂得了解包,封包自然就明白了。

  socket发送和接收数据都是通过字符串的格式进行的。解包就是把这个字符串解析出来int , short , char。

  假设现在有一个字符串,char src[],里面包含了一个short int 数据, 一个int数据 , 一个char[6]字符串。

  解析的步骤如何。

  1.首先解出来short int

  short int shortNum = *(short int*)src;

  2.接着解int,注意src的下标,为什么会是2呢?因为short int 占据了前两个字节,如果int要从short int 的后面开始解的

  int intNum = *(int*)(src+2);

  3.接着解析char[]字符串,注意src+6,因为short int 和int已经占据了前面6个字节,所以字符串的解析是从他俩后面开始解的

  char destChar[100];

  memcpy(destChar, src+6, len);

  通过上面的几个步骤就可以从字符串里面解出来想要的数据格式了。

  下面是一段简单的代码,希望能加深对解包封包的理解

  

#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char* argv[])
{
    short shortNum = 10;
    int intNum = 90909090;
    char str[] = "ABCDEFG";
    char buf[1000];
    //开始封包
    *(short int*)buf = shortNum;
    *(int*)(buf+2) = intNum;
    memcpy(buf+6, str, strlen(str));
    //封包结束

    //开始解包
    short int shortNum2 = *(short*)buf;
    int intNum2 = *(int*)(buf+2);
    char str2[7];
    memcpy(str2, buf+6, strlen(str));
    printf("shortNum2:%d\n", shortNum2);
    printf("intNum2:%d\n", intNum2);
    printf("str2:%s\n", str2);
    //解包结束

    return 0;
}

 

  上面的代码是在gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)编译完成,并且可顺利运行。

 

posted @ 2015-05-15 00:29  walkabc  阅读(1976)  评论(0编辑  收藏  举报