使用RawSocket,自定义IP Header
code:
-----------------------------
......
[StructLayout(LayoutKind.Explicit)]
 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, Etc.)
  [FieldOffset(10)] public ushort ip_checksum; //16位IP首部校验和
  [FieldOffset(12)] public uint   ip_srcaddr;     //32位源IP地址
  [FieldOffset(16)] public uint   ip_destaddr;   //32位目的IP地址
 }
......
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
-----------------------------------------------

解决方案 »

  1.   

    就只能把IP包从从组一篇,而不能只修改一下protocol number,是吗?
      

  2.   

    帮忙再想想其它方法吧,我只是想改protocol number一项而已,不想重新再去生成一个IP Header.
      

  3.   

    SkyGG(水元素)的方法应该没问题了
    并且似乎也只能这么做
      

  4.   

    what is winpcap?怎么做?说来听听。
      

  5.   

    用.net实现的raw socket只能实现对网络封包的监视功能,因为winsock2是在应用层实现的,它不能对数据包本身进行任何处理。如果要对包的内部数据进行操作,比如加密,建议采用核心态驱动程序,比如功能强大的ndis中间层驱动程序来完成。这样可以对数据包在网络层进行处理。 --我刚看到的,看来用C#提供的Socket是很难实现了。
      

  6.   

    NDIS 中间层驱动程序(IMD)开发人员指南
    http://www.netwall.cn/resources/docs/NDIS_DEVGUIDE.doc
    越到底层越复杂啊
      

  7.   

    NDIS 中间层驱动程序(IMD)开发人员指南
    http://www.netwall.cn/resources/docs/NDIS_DEVGUIDE.doc
    越到底层越复杂啊