public struct IpHeader
{
[FieldOffset(0)]  public byte   ip_verlen;      // 4位首部长度,4位IP版本号
[FieldOffset(1)]  public byte   ip_tos;         // 8位服务类型TOS
[FieldOffset(2)]  public ushort ip_totallength; // 16位包总长度(字节)
[FieldOffset(4)]  public ushort ip_id;          // 16位标识
[FieldOffset(6)]  public ushort ip_offset;      // 3位标志位
[FieldOffset(8)]  public byte   ip_ttl;         // 8位生存时间 TTL
[FieldOffset(9)]  public byte   ip_protocol;    // 8位协议 (TCP, UDP 或其他):ICMP=1,TCP=6,UDP=17
[FieldOffset(10)] public ushort ip_checksum;    // 16位IP首部校验和
[FieldOffset(12)] public long   ip_srcaddr;     // 32位源IP地址
[FieldOffset(16)] public long   ip_destaddr;    // 32位目的IP地址
}使用了RawSocket,在接收到数据包后,将其转换为IpHeader结构,然后取出源地址转化为IPAddress
IpHeader *header = (IpHeader *)received_data;
header_len       = (header->ip_verlen & 0x0F) << 2;
protocol         = header->ip_protocol;
ip_srcaddr       = header->ip_srcaddr;
ip_destaddr      = header->ip_destaddr;// 这里会出错:指定的参数已超出有效值的范围。参数名: newAddress
tmp_ip           = new IPAddress(ip_srcaddr);
from_ip          = tmp_ip.ToString();
tmp_ip           = new IPAddress(ip_destaddr);
to_ip            = tmp_ip.ToString();
tmp_ip           = null;/////////////////////////////////////////////////////////////////////
程序中查看ip_srcaddr、ip_destaddr值如下:
ip_srcaddr : -281431975460854
ip_destaddr: -8574703053125517302

解决方案 »

  1.   

    你后期的转换不对c#中long是8位,而本身的struct是4位。
      

  2.   

    是的,是数据类型的问题,我尝试替换为uint后就可以了。再问一个,抓到包后怎么拆TCP、UDP数据包啊。
      

  3.   

    >>c#中long是8位,而本身的struct是4位
      

  4.   

    to 再问一个,抓到包后怎么拆TCP、UDP数据包啊。你要做什么?
      

  5.   

    类似于sniffer,我想将TCP、UDP数据分析出来。
      

  6.   

    ref:
    http://www.codeproject.com/cs/internet/hssniffer.asp