Q:你好!
看过了你在csdn上发表的《用C#下的Raw Socket编程实现网络封包监视》,觉得很感兴趣,而且对我的帮助很大。不过在调试的过程中遇到一些问题,特此向你请教一下。谢谢!
首先
socket.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.HeaderIncluded, 1);
byte []IN = new byte[4]{1, 0, 0, 0};
byte []OUT = new byte[4];
//低级别操作模式,接受所有的数据包,这一步是关键必须把socket设成raw和IPLevel才可用SIO_RCVALL
int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT);
ret_code = OUT[0] + OUT[1] + OUT[2] + OUT[3];//把4个8位字节合成一个32位整数
if(ret_code != 0) ret_value = false;
应改是用来设置socket的工作方式的,我想知道的是你所是值得常量SIO_RCVALL = 0x98000001是如何得到的(我是指后面的十六进制数十怎么得到的),有没有相关的文档推荐一下。我看过一些,不过没有眉目。这些数字应该是什么所谓的操作控制码,但我找不到更详细的资料,希望能指点一下。另外,在第二行中那个IN数组为什么要那么设置,这点我还不太明白。
第二
e.HeaderLength=(uint)(head->ip_verlen & 0x0F) << 2;
在这句话中,你是想要得到数据包的IP头长,从IP的结构来看,似乎是不应该移位(即左移两位)的,因为屏蔽掉前前四位之后,所剩的四位正好为头长,不知这个地方是否有问题。
第三
这段代码是由原始套接字作封包监视,但不知能否实现数据包的拦截。因为如果可以的话就可以实现放火墙的功能了。
不好意思!
第一次给你发信就问了这么一大堆,耽误了你的时间!
再次表示感谢!
等待你的回信:)
A:
第一.
在winsock2.h中定义了以下宏:
#define IOC_VOID 0x20000000 /* no parameters */
#define IOC_OUT 0x40000000 /* copy out parameters */
#define IOC_IN 0x80000000 /* copy in parameters */
#define IOC_UNIX 0x00000000
#define IOC_WS2 0x08000000
#define IOC_PROTOCOL 0x10000000
#define IOC_VENDOR 0x18000000
#define _WSAIO(x,y) (IOC_VOID|(x)|(y))
#define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y))
里面没有SIO_RCVALL的定义,但是你可以查看msdn中的ms-help://MS.MSDNQTR.2003FEB.2052/winsock/winsock/wsaioctl_2.htm看WSAIoctl函数中的SIO_RCVALL 的说明,你可以知道它是这样定义的:
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
即:
0x80000000|0x18000000|0x00000001
其中IOC_VENDOR 实际上是IOC_WS2|IOC_PROTOCOL ,因为要receive all IP packets on the network on win32 platform.
至于用四字节数组来接收数据流,是因为网络数据流串行的在网线传输,需要接收到32位(二进制)后才能对该串行流进行解析,这是一种串行通信协议,当接收到32位后,网卡会把这32位(二进制)传给一个四字节数组。因为要和IOControl的返回值保持一致,返回的是32位的int32,所以要把out〔〕数组整合成int。至于byte []IN = new byte[4]{1, 0, 0, 0};这样定义是,因为这样整合成的整形数是(十六进制) 00 00 00 01 ,即1,输入32位数的值为一,是因为要把socket设置成非阻塞状态(which is nonzero if nonblocking mode is to be enabled and zero if it is to be disabled. )。而out得到的是一次接收操作中得到的字节数 (returns the total amount of data that can be read in a single receive operation; )。
第二:
数据包包头长的值为4位二进制,值域0-15,如果不移位的话包头长度不会超过15字节,怎么会?正如上面所说。每32位二进制是一个网络串行通信的数据单元,描述包头长的四位记录的是数据单元数,不是字节数,所以要乘与四(32bit数据单元长度/8bit字节长度),即左移二位。
第三:
基于.net的raw socket是基于winsock2来实现的,它实现在七层模型的应用层,而应用层的封包拦截向来很弱,一般在应用层实现可用spi(服务提供者),其实这需要系统调用。我试过,在.net下效果不是太好,数据包要么全部都拦住了,要么全部放行,系统反应很慢,稳定性很弱,呵呵,这是.net的隐痛。一种比较流行的做法是写网络层的ndis驱动程序,ndis hook driver和ndis中间层驱动都可以,其中ndis中间层驱动功能强大,不光可以进行封包拦截,还可以实现对网络数据流的加密,强烈建议使用!
至于在.net下做防火墙,可用managed C++做来DeviceIoControl,可以查看我的文章:
http://www.csdn.net/develop/read_article.asp?id=21480
获得RawSocket的C#源代码请访问:http://www.mscenter.edu.cn/blog/seafrog/archive/2005/05/30/2866.html
分享到:
相关推荐
C#raw Socket编程 C#raw Socket编程是指使用C#语言实现原始套接字(Raw Socket)的编程技术。原始套接字是一种网络编程接口,允许开发者在应用层实现网络封包监视和控制。 Windows Sockets 是一种网络编程接口,...
在Windows系统中,利用raw socket编程通常涉及到Winsock库,这是一个Windows API,提供了一套标准的套接字编程接口。要创建一个raw socket,我们可以调用socket()函数,指定协议为 IPPROTO_IP 或 IPPROTO_IPV6 对于...
RawSocket在链路层的收发,arp,多线程指定网守发示例
总的来说,使用C#的Raw Socket实现网络封包监视涉及对网络协议的深入理解,以及C#编程技巧的运用。通过这个过程,我们可以获取到网络通信的详细信息,这对于开发、调试和维护网络应用程序是非常有价值的。但同时,也...
C#.Net Socket 网络通讯编程 C#.Net Socket 网络通讯编程是基于 TCP/IP 协议的应用程序接口(API),它定义了许多函数和例程,程序员可以用它们来开发 TCP/IP 网络应用程序。Socket 可以看成是网络通信上的一个端点...
总的来说,`raw_socket`是网络编程中的一个强大工具,对于网络协议理解、性能优化和安全研究都有着重要的作用。然而,它也需要开发者具备深厚的网络协议知识和谨慎的态度,以避免滥用带来的风险。在日常工作中,了解...
《使用Rawsocket与Winpcap实现HTTP数据抓包的C#源码解析》 在IT领域,网络数据抓包是一项重要的技术,它可以帮助我们监测、分析网络通信过程中的数据流,排查网络问题或进行安全审计。本文将围绕“rawsocket抓包...
总结,C#的Socket编程提供了基础的网络通信能力,通过Socket类和相关的辅助类,可以实现TCP或UDP的客户端和服务器程序。在实际应用中,通常会结合数据流进行数据的打包和解包,以满足各种复杂的网络通信需求。在选择...
#### 四、RawSocket编程实例 接下来将详细介绍如何使用C#语言下的RawSocket进行网络封包监视。 ##### 1. IPHeader结构定义 为了处理接收到的数据包,首先需要定义一个结构体`IPHeader`,用于暂存有关网络封包的信息...
C#作为.NET框架下的编程语言,提供了丰富的库和工具来实现这一功能。本项目是一个基于C#的socket抓包工具,同时也支持pcap模式,这种模式依赖于WinPcap库。 首先,我们来看“C# socket抓包”。在C#中,Socket类是...
在C#编程环境下实现封包拦截,我们需要利用.NET Framework提供的套接字(Socket)类和WinPCap库。WinPCap是Windows平台下广泛使用的底层网络访问库,它可以提供对网络数据包的捕获和发送功能。然而,由于C#原生不...
在C#中,Socket编程是网络通信的基础,而异步接受网络广播则是实现高效、非阻塞网络数据传输的关键技术。本文将详细讲解如何在VS2005或VS2008环境下使用C#的Socket类进行异步接收网络广播。 首先,要开启Socket的...
### C# 网络编程(Socket) #### Socket 基本原理 Socket 是网络通信的基础,用于在不同计算机之间建立通信链路。在 C# 中,Socket 编程主要依赖于 `System.Net.Sockets` 命名空间提供的类和方法。 **17.1 Socket...
### 知识点一:C#中的Socket编程基础 #### 1.1 Socket概念 - **定义**:在计算机网络中,Socket(套接字)是一种用于进程间通信的机制,它允许不同计算机上的应用程序通过网络进行双向通信。 - **工作原理**: - ...
- "C# Socket1.txt"和"c# socket.txt":同样可能是C# Socket编程的基础示例,涵盖了基本的连接、发送和接收数据的代码。 6. **学习资源**: 初学者可以通过阅读这些文本文件来理解C#中的Socket编程,了解如何创建...
在C#中,可以使用`System.Net.Sockets.Socket`类的`SocketType.Raw`和`ProtocolType.IP`来创建一个RawSocket实例。使用RawSocket时,需要注意设置适当的IP头选项和协议头,因为这些通常由操作系统自动处理。 在源码...
### 分布式 Socket 编程:基于 C# ...以上是关于 **分布式 Socket 编程** 在 C# 中的基本原理和实现方法。这些知识点涵盖了从 Socket 的基本概念到实际编程的具体步骤,有助于开发者更好地理解和运用 Socket 编程技术。
在C#.NET编程中,网络通信是应用开发中的一个重要部分。本文将深入探讨如何使用同步和异步方式通过SOCKET进行通信,以及如何结合多线程技术来实现高效的数据交换。 首先,SOCKET是TCP/IP网络协议的接口,它提供了...