首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
各大城市软件开发培训、软件人才免费咨询热线:400-700-5807
 您现在的位置: 中国IT实验室 >> 桌面开发 >> C# >> 正文
用Visual C#实现网络封包监视
来源:ChinaItLab 作者:佚名 时间:2007-7-12


  C#的IOControl函数不像WSAIoctl函数那么复杂,其中只包括其中的控制操作码、输入字节流、输出字节流三个参数,不过这三个参数已经足够了。我们看到函数中定义了一个字节数组:byte []IN = new byte[4]{1, 0, 0, 0}实际上它是一个值为1的DWORD或是Int32,同样byte []OUT = new byte[4];也是,它整和了一个int,作为WSAIoctl函数中参数lpcbBytesReturned指向的值。

  因为设置套接字选项时可能会发生错误,需要用一个值传递错误标志:

public bool ErrorOccurred
{
 get
 {
  return error_occurred;
 }
}

  下面的函数实现的数据包的接收:

//解析接收的数据包,形成PacketArrivedEventArgs事件数据类对象,并引发PacketArrival事件
unsafe private void Receive(byte [] buf, int len)
{
 byte temp_protocol=0;
 uint temp_version=0;
 uint temp_ip_srcaddr=0;
 uint temp_ip_destaddr=0;
 short temp_srcport=0;
 short temp_dstport=0;
 IPAddress temp_ip;

 PacketArrivedEventArgs e=new PacketArrivedEventArgs();//新网络数据包信息事件

 fixed(byte *fixed_buf = buf)
 {
  IPHeader * head = (IPHeader *) fixed_buf;//把数据流整和为IPHeader结构
  e.HeaderLength=(uint)(head->ip_verlen & 0x0F) << 2;

  temp_protocol = head->ip_protocol;
  switch(temp_protocol)//提取协议类型
  {
   case 1: e.Protocol="ICMP"; break;
   case 2: e.Protocol="IGMP"; break;
   case 6: e.Protocol="TCP"; break;
   case 17: e.Protocol="UDP"; break;
   default: e.Protocol= "UNKNOWN"; break;
  }

  temp_version =(uint)(head->ip_verlen & 0xF0) >> 4;//提取IP协议版本
  e.IPVersion = temp_version.ToString();

  //以下语句提取出了PacketArrivedEventArgs对象中的其他参数
  temp_ip_srcaddr = head->ip_srcaddr;
  temp_ip_destaddr = head->ip_destaddr;
  temp_ip = new IPAddress(temp_ip_srcaddr);
  e.OriginationAddress =temp_ip.ToString();
  temp_ip = new IPAddress(temp_ip_destaddr);
  e.DestinationAddress = temp_ip.ToString();

  temp_srcport = *(short *)&fixed_buf[e.HeaderLength];
  temp_dstport = *(short *)&fixed_buf[e.HeaderLength+2];
  e.OriginationPort=IPAddress.networkToHostOrder(temp_srcport).ToString();
  e.DestinationPort=IPAddress.NetworkToHostOrder(temp_dstport).ToString();

  e.PacketLength =(uint)len;
  e.MessageLength =(uint)len - e.HeaderLength;

  e.ReceiveBuffer=buf;
  //把buf中的IP头赋给PacketArrivedEventArgs中的IPHeaderBuffer
  Array.Copy(buf,0,e.IPHeaderBuffer,0,(int)e.HeaderLength);
  //把buf中的包中内容赋给PacketArrivedEventArgs中的MessageBuffer
  Array.Copy(buf,(int)e.HeaderLength,e.MessageBuffer,0,(int)e.MessageLength);
 }
 //引发PacketArrival事件
 OnPacketArrival(e);
}

上一页  [1] [2] [3] [4] 下一页

【责编:Youping】
中国IT教育热线咨询
相关文章
Java中消除实现继承和面向接口编程
在Visual C#中定义和使用自己的特性…
实现Java平台的三种方式
Delphi中用API实现在MSN的信息提示
利用C#实现标注式消息提示窗口
如何用Delphi实现子目录级的文件查询
如何使用Delphi实现无边界窗体的移动
用纯JAVA语言编程读取MAC地址的实现
VB.NET实现PC与掌上电脑PPC的双向通信
用Visual C++实现局域网IP多播…
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·框架:J2EE WEB应用架构分析…03-13
·几种VC++数据库开发技术的相对比…03-13
·利用C#实现标注式消息提示窗口03-13
·用C#创建COM对象03-13
·Visual C#多线程参数传递浅析…03-13
·Visual C#多线程参数传递浅析…03-13
·基于HOOK和MMF的Win密码渗透技术11-15
·Visual C++设计超强仿QQ自动伸缩…11-15
·Java SE 6.0实现高质量桌面集成开…11-15
·史玉柱东山再起幕后高人11-15
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视…07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05