千家信息网

C#的Raw Socket是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"C#的Raw Socket是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#的Raw Socket是什么"吧!谈起C# Raw S
千家信息网最后更新 2026年11月02日C#的Raw Socket是什么

本篇内容主要讲解"C#的Raw Socket是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C#的Raw Socket是什么"吧!

谈起C# Raw Socket编程,大家也许会想起QQ和IE,没错。还有许多网络工具如P2P、NetMeeting等在应用层实现的应用程序,也是用Socket来实现的。Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点。Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中。Socket规范2.2版(其在Windows平台上的版本是Winsock2.2,也叫Winsock2)在 1996 年 5 月发行,Windows NT 5.0及以后版本的Windows系统支持Winsock2,在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。

本文向大家介绍Windows Sockets的一些关于用C#实现的原始套接字(Raw Socket)的编程,以及在此基础上实现的网络封包监视技术。同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本机的IP包,通过原始套接字,我们也可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。

在本文例子中,我在nbyte.BasicClass命名空间实现了C# Raw Socket类,它包含了我们实现数据包监视的核心技术。在实现这个类之前,需要先写一个IP头结构,来暂时存放一些有关网络封包的信息:

public struct IPHeader   {   [FieldOffset(0)] public byte ip_verlen; //I4位首部长度+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地址   }

这样,当每一个封包到达时候,可以用强制类型转化把包中的数据流转化为一个个IPHeader对象。

下面就开始写Raw Socket类了,一开始,先定义几个参数,包括:

private bool error_occurred; //套接字在接收包时是否产生错误   public bool KeepRunning; //是否继续进行   private static int len_receive_buf; //得到的数据流的长度   byte [] receive_buf_bytes; //收到的字节   private Socket socket = null; //声明套接字

还有一个常量:

const int SIO_RCVALL = unchecked((int)0x98000001);//监听所有的数据包

这里的SIO_RCVALL是指示Raw Socket接收所有的数据包,在以后的IOContrl函数中要用,在下面的构造函数中,实现了对一些变量参数的初始化:

public RawSocket() //构造函数   {   error_occurred=false;   len_receive_buf = 4096;   receive_buf_bytes = new byte[len_receive_buf];   }

下面的函数实现了创建Raw Socket,并把它与终结点(IPEndPoint:本机IP和端口)绑定:

public void CreateAndBindSocket(string IP) //建立并绑定套接字   {   socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);   socket.Blocking = false; //置socket非阻塞状态   socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0)); //绑定套接字   if (SetSocketOption()==false) error_occurred=true;   }

其中,在创建套接字的一句Socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);中有3个参数:

第一个参数是设定地址族,MSDN上的描述是"指定 Socket 实例用来解析地址的寻址方案",当要把套接字绑定到终结点(IPEndPoint)时,需要使用InterNetwork成员,即采用IP版本4的地址格式,这也是当今大多数套接字编程所采用一个寻址方案(AddressFamily)。

第二个参数设置的套接字类型就是我们使用的Raw类型了,SocketType是一个枚举数据类型,Raw套接字类型支持对基础传输协议的访问。通过使用 SocketType.Raw,你不光可以使用传输控制协议(Tcp)和用户数据报协议(Udp)进行通信,也可以使用网际消息控制协议 (Icmp) 和 Internet 组管理协议 (Igmp) 来进行通信。在发送时,您的应用程序必须提供完整的 IP 标头。所接收的数据报在返回时会保持其 IP 标头和选项不变。

第三个参数设置协议类型,Socket 类使用 ProtocolType 枚举数据类型向 Windows Socket API 通知所请求的协议。这里使用的是IP协议,所以要采用ProtocolType.IP参数。

到此,相信大家对"C#的Raw Socket是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

套接字 数据 类型 参数 网络 C# 地址 控制 函数 版本 传输 应用 支持 编程 原始 系统 长度 封包 内容 基础 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 互联网科技资迅 金诺互联网科技 没上市的科技互联网公司 互联网科技革命 互联网科技英文翻译 银川新华互联网科技学校地址 哈尔滨新华互联网科技学院 互联网教育科技公司vipkid 互联网科技实习生岗位职责 成都铂石互联网科技做什么的 互联网还是高科技吗 崇明区互联网教育科技诚信经营 东莞新华互联网科技学校 互联网科技大赛获奖感言 山东子淼互联网科技有限公司 电子商务与互联网科技的关系 上海创道互联网络科技有限公司 山东蛋芒互联网科技有限公司 互联网 科技节活动 微视频大赛 北京路客互联网科技有限公司 疫情对互联网科技公司影响 互联网的科技创新 互联网 科技创业 郑州华宇互联网科技 成都狮子座互联网科技 居家互联网科技有限公司 科技赋能互联网健康 中天科技中国工业互联网 扫呗互联网科技有限公司
0