用 winsock的 api 捕获的网络数据包,怎么区分啊
是tcp还是udp

解决方案 »

  1.   

    IP包往上是TCP,UDP
    两个包格式不一样的
      

  2.   

    具体说来听听啊,RecvBuf 为接受数据包的存储地址;
    IP 为定义的结构体,是ip 数据包头;
    TCP 为定义的结构体,是tcp 数据包头                     IP ip = *(IP*)RecvBuf;   TCP tcp = *(TCP*)(RecvBuf-ip.HdrLen);//???? 有错误么?
      

  3.   

    ip头有一个8位的协议字段,就是用来区别各种协议的
    当它的值为6时,表示这个数据包是TCP的,当为17时是UDP的
      

  4.   

    即使是TCP包,传到你机器的时候外面也会包着IP包
    所以使用Raw Socket接收IP数据包,在分析IP包载荷中封着的是不是TCP包
      

  5.   

    能 不能具体说来听听啊,比如,我在RecvBuffer 地址中接收了一个数据包,我怎么对它分析呢?
      

  6.   

    这个你要对各协议的首部要了解,而且要用原始套接字才能分析得到
    普通的套接字只能接收到用户层的数据包,也就是已脱了各协议头的数据包
    你可以看看windows网络编程技术的13章,专讲原始套接字的
      

  7.   

    ,,,,,,,,,,
    UDP和TCP都是IP包你要区别IP包和TCP干什么?。。
      

  8.   

    先建立一个IP包头的结构体(好像windows已经预先定义过了,不用你自己定义),把数据包的最前面部分保存在IP结构体内,然后再分析结构体中每个成员变量的值
    具体程序刚才楼上提到,可以看《windows网络编程技术》
      

  9.   

    ip包中的数据部分,可能是一个tco包,或者是一个udp包,是不是有别的情况;
    比如说,里面纯粹就是一个数据;
      

  10.   

    TCP包属于IP包.
    按照IP协议分析就可以了
    struct IP_HEADER
    {
    byte ver_len; //版本4位,头长度4位,报头长度以32位为一个单位
    byte type; //类型8位
    byte length[2]; //总长度,16位,指出报文的以字节为单位的总长度,报文长度不能超过65536个字接,否则认为报文遭到破坏
    byte id[2]; //报文标示,用于多于一个报文16位
    byte flag_offset[2];//标志,3位 数据块偏移13位
    byte time; //生存时间,8位
    byte protocol; //协议,8位
    byte crc_val[2]; //头校验和,16位
    byte src_addr[4]; //源地址,32位
    byte des_addr[4]; //目标地址,32位
    byte options[4]; //选项和填充,32位
    };#define ICMP 1 //控制信息协议
    #define TCP 6 //传输控制协议
    #define EGP 8 //外部网关协议
    #define IGP 9 //内部网关协议
    #define UDP 17 //用户数据报协议明白了吗?
      

  11.   


    根据IP_HEADER.protocol的值判断ip包中的数据部分到底是什么协议
      

  12.   

    创建原始socket,然后自己解析接收到的数据即可,数据格式为IP头+TCP(UDP)头+实际的数据
      

  13.   

    不都是,看看TCP/IP详解卷一。
      

  14.   

    如果你学过网络协议栈,你应该知道,网卡接收到的是MAC层的以太网包
    MAC层再往上传,可能传到IP层,也可能传到别的协议
      

  15.   

    那么说来,网卡接收是的以太网的帧了,不是ip 包了,
    把ip包+以太网的帧头,是这样吧?
      

  16.   

    对,不过你不用关心这些
    因为Socket接收到的时候已经把以太网的帧头剥掉了