返回首页

{S0}简介
{A}已在事实上库数据包捕获应用,但问题是,它是唯一的原生C和C。
这是一个尝试端口。NET环境中的一些关键的WinPcap功能。这里的示范项目是C#编写的。
首先,你需要从 WinPcap的安装,然后提取项目的zip文件。一定要在项目中引用dotnetwinpcap.dll如果尚未如此。可用的方法

static ArrayList FindAllDevs()

返回一个ArrayList的设备对象,每一个以太网接口系统。{C}
打开从一个设备对象获得接口的名称来源的以太网接口,snaplen字节的最大数量从每个数据包捕获,标志= 1意味着混杂模式,read_timeout ReadNext阻断时间前它返回。
PCAP_NEXT_EX_STATE ReadNext( out PacketHeader p, out byte[] packet_data)

读取下一个数据包,并返回数据包的详细信息(大小和时间戳)对象p,packet_data(字节数组)的数据包的原始数据。
void StopDump()

停止捕获数据文件的倾销。
bool StartDump(string filename) 

开始捕获数据文件的倾销。
bool SetMinToCopy(int size)

设置最低OnReceivePacket火灾需要被驱动之前收到的字节数。降低这可以提高响应时间,但增加了系统调用,从而降低程序的效率。
bool SetKernelBuffer(int bytes)

设置包捕获驱动程序的内核缓冲区中的字节数。增加,以避免数据包丢失和提高性能。默认值是1 MB。
void StartListen()

启动监听数据包。
void StopListen()

停止监听的数据包。
void Close()

停止所有操作,并释放所有资源。
bool SendPacket(byte[] rawdata)

发送包含在RAWDATA字节以上的电线。以太网校验将自动发送数据包前加入。如果发送成功,则返回true,否则返回false。属性
bool IsListening

,如果dotnetWinpcap对象是听,否则为false。
string LastError

返回库所遇到的最后一个错误,如果有的话。事件支持
delegate void ReceivePacket (object sender, PacketHeader p, byte[] s);

event ReceivePacket OnReceivePacket;

StartListen()被调用后,OnReceivePacket将开始遇到的每一个数据包火,直到StopListen()被调用,或关闭()被调用。
上面签名的委托对象可能会连接到OnReceivePacket事件收到通知,并进行进一步的处理,在演示的源代码。历史第28届,2003年5月:战后初期2003年8月25 - 更新的源代码2008年6月,28日:更新的源代码三月二十四日,2009:更新的源代码,包括客户端代码,由阿信的要求

回答

评论会员:游客 时间:2011/11/29
在ReceivePacket遇到异常(对象发件人,PacketHeaderP,字节[]S)。改为:私人无效ReceivePacket(对象发件人,PacketHeaderP,字节[]S){this.pack_count; (rtb.InvokeRequired){ rtb.Invoke(新MethodInvoker(委托 { rtb.AppendText("P含量:\N"); rtb.AppendText("Caplength:"p.Caplength的"\n");rtb.AppendText("长度:"p.Length的"\n");rtb.AppendText("时间戳:"(p.TimeStamp)的"\n"); labPacketCnt.Text=Convert.ToString(this.pack_count);}));{BR} }}
MIKI ITZ离合器
评论会员:游客 时间:2011/11/29
cbAdapters.Items.Add(((设备)devlist[I])名称":"......((设备)devlist[I])说明);"((设备)devlist[I]。)名称。"devlist是一个ArrayList的网卡DEattributs对象,我不知道如何添加DE设备类一起请帮我转换成代码的PICE的C/CLI对不起我的英语imgsrc=http://www.orcode.com/upimg/2011_11_29_20_01_36_1.gif我的瑞士。帮助表示感谢
!brickner
评论会员:游客 时间:2011/11/29
好文章,如果你想使用的WinPcap在C#中,一个简单的方法去使用Pcap.Net。http://pcapdotnet.codeplex.com这是一个完整的包装(全功能)与开源的WinPcap。它也给你的能力,建立不同的数据包,并充分解释在C#中的数据包。这是写在C/CLI中,具有更好的性能比在示例代码中使用的InteropServices这里给出。{BR​​}我希望你觉得它有用。波阿斯
。yuriyag
评论会员:有趣的链接 时间:2011/11/29
MPH1956
评论会员:游客 时间:2011/11/29
对不起thetypoes!让"嗅"和"设备"!感谢imgsrc=http://www.orcode.com/upimg/2011_11_29_20_01_36_1.gif
MPH1956
评论会员:游客 时间:2011/11/29
我想使用这种类型的应用程序做一些包在一个WinCEdevceisnbiffing-没有任何人有任何的经验,请?提前感谢!{S3}
eightbitwitch
评论会员:游客 时间:2011/11/29
在Form1.cscodepre spanclass="code-keyword"private/spanspanclass="code-keyword"void/spanReceivePacket(spanclass="code-keyword"object/spansender,PacketHeaderp,spanclass="code-keyword"byte/span[]s) { spanclass="code-keyword"this/span.pack_count++; rtb.Focus(); rtb.AppendText(spanclass="code-string""/spanspanclass="code-string"Contentofp:\n"/span); rtb.AppendText(spanclass="code-string""/spanspanclass="code-string" Caplength:"/span+p.Caplength+spanclass="code-string""/spanspanclass="code-string"\n"/span); rtb.AppendText(spanclass="code-string""/spanspanclass="code-string" Length:"/span+p.Length+spanclass="code-string""/spanspanclass="code-string"\n"/span); rtb.AppendText(spanclass="code-string""/spanspanclass="code-string" Timestamp:"/span+(p.TimeStamp)+spanclass="code-string""/spanspanclass="code-string"\n"/span); labPacketCnt.Text=Convert.ToString(spanclass="code-keyword"this/span.pack_count);  }/pre/code线"rtb.Focus();"而来的是运行时错误"InvalidOperationError"跨线程访问一个Forms.Control请任何人都可以解决这个问题?我没有C#中expriences,使我不能自我。的问候,瓦莱丽
会员6430
评论会员:游客 时间:2011/11/29
您​​好8bitwitch,在表格()构造函数请加入这一行 Form.CheckForIllegalCrossThreadCalls=FALSE;我至于彼得Peter567
boblogan
评论会员:游客 时间:2011/11/29
两种方法来避免这种错误:微软说:发生此异常可靠调试期间和运行时,在某些情况下,。当您调试。NETFramework的应用程序,您写了。NETFramework2.0版之前,您可能会看到这个异常。我们强烈建议您解决这个问题,当你看到它,但您可以禁用CheckForIllegalCrossThreadCalls属性设置为false。这将导致您的控制运行,就像它会运行在VisualStudio。NET2003和。NETFramework1.1中。但你是强烈建议,以避免标志......修复使用委托的混账东西...这里是一个列表,显示了如何设置和使用这样一个ReceivePacket方法委托。不仅是委托和委托回调添加到源...但ReceivePack方法需要修改。注意:使用InvokeRequired-这使我们能够从内部和跨线程调用单的UpdateScreen处理程序../codeprespanclass="code-comment"///spanspanclass="code-comment"classicdelegateforcrossthreadformcontrol/workerthreaddataaccess/spanspanclass="code-keyword"delegate/spanspanclass="code-keyword"void/spanUpdateScreen(PacketHeaderp,spanclass="code-keyword"byte/span[]data);spanclass="code-comment"///spanspanclass="code-comment"theactualdatatocontrolhandler/spanspanclass="code-keyword"private/spanspanclass="code-keyword"void/spanUpdateScreen(PacketHeaderp,spanclass="code-keyword"byte/span[]pdata){rtb.Focus();rtb.AppendText(spanclass="code-string""/spanspanclass="code-string"Contentofp:\n"/span);rtb.AppendText(spanclass="code-string""/spanspanclass="code-string" Caplength:"/span+p.Caplength+spanclass="code-string""/spanspanclass="code-string"\n"/span);rtb.AppendText(spanclass="code-string""/spanspanclass="code-string" Length:"/span+p.Length+spanclass="code-string""/spanspanclass="code-string"\n"/span);rtb.AppendText(spanclass="code-string""/spanspanclass="code-string" Timestamp:"/span+(p.TimeStamp)+spanclass="code-string""/spanspanclass="code-string"\n"/span);labPacketCnt.Text=Convert.ToString(spanclass="code-keyword"this/span.pack_count);}  spanclass="code-keyword"private/spanspanclass="code-keyword"void/spanReceivePacket(spanclass="code-keyword"object/spansender,PacketHeaderp,spanclass="code-keyword"byte/span[]s) { spanclass="code-keyword"this/span.pack_count++;spanclass="code-comment"///spanspanclass="code-comment"InvokeRequiredrequiredcomparesthethreadIDofthe/spanspanclass="code-comment"///spanspanclass="code-comment"callingthreadtothethreadIDofthecreatingthread./spanspanclass="code-keyword"if/span(spanclass="code-keyword"this/span.rtb.InvokeRequired)spanclass="code-comment"///spanspanclass="code-comment"Ifthesethreadsaredifferent,itreturnstrue./span{spanclass="code-comment"///spanspanclass="code-comment"createdelegateforinvocationcall/spanUpdateScreend=spanclass="code-keyword"new/spanUpdateScreen(UpdateScreen);spanclass="code-comment"///spanspanclass="code-comment"getprivatecopyofotherthreaddataontothisthread/spanPacketHeadermyPh=spanclass="code-keyword"new/spanPacketHeader(p.ts,p.Caplength,p.Length);spanclass="code-keyword"byte/span[]data=spanclass="code-keyword"new/spanspanclass="code-keyword"byte/span[s.Length];s.CopyTo(data,spanclass="code-digit"0/span);spanclass="code-comment"///spanspanclass="code-comment"invokehandlerthroughreflection.../spanspanclass="code-keyword"this/span.Invoke(d,myPh,data);}spanclass="code-keyword"else/spanspanclass="code-comment"///spanspanclass="code-comment"samethreadsonormalcallwillsuffice/spanUpdateScreen(p,s); }/pre/code
eightbitwitch
评论会员:游客 时间:2011/11/29
您好,我必须承认,当连接关闭服务器。我想,在FIN标志的TCP头看。但我只可以接收的数据包有效载荷,并从来没有设置FIN标志的数据包。像Etherdetect,这也基于WinPcap的应用,显示我这个数据包。什么错误,什么是我错了吗?关于来自德国,瓦莱丽
eightbitwitch
评论会员:游客 时间:2011/11/29
您好,我会做发送超过dotnetwinpcap/WinPcap的包,但我不能从VB9(VB.net)访问的方法。我没有任何expriences在C#(奥德比C-Famliy语言),这样我就可以ñOTmodofy我的愿望源。任何人可以帮助至于,瓦莱丽(对不起,我不好英语,我从德国了)
Umopepisdn
评论会员:游客 时间:2011/11/29
为了得到这个在Vista64和VisualStudio2008与最新的净,我不得不做出一些改变项目和代码。首先,dotnetWinpCap.FindAllDevs()抛出一个异常,由于我的系统上无法找到一个64位的WinPcap。更改所有的项目,以建立x86的唯一解决这个问题。然后,ReceivePacket()抱怨,从另一个线程访问窗体控件​​。我决心改变ReceivePacket():私人无效ReceivePacket(对象发件人,PacketHeaderP,字节[]S){ this.pack_count;this.BeginInvoke(新MethodInvoker(委托() {rtb.Focus();rtb.AppendText("P含量:\N");rtb.AppendText("Caplength:"p.Caplength的"\n");rtb.AppendText("长度:"p.Length的"\n");rtb.AppendText("时间戳:"(p.TimeStamp)的"\n");labPacketCnt.Text=Convert.ToString(this.pack_count);}));{BR}}希望这会有所帮助的人。宇母
79167115 |感谢你的文章帮助了我这么多,我的软件迷,我非常喜欢你的文章,虽然我chinese.my网站欢迎您的
评论会员:约旦感知 时间:2011/11/29
?有人可以教我如何使用这个

还给我请soccerboy_24@charter.net

感谢
评论会员:legion_ 时间:2011/11/29

评论会员:Unruled男孩 时间:2011/11/29
我们可以制作一个包之前发送?比方说,我们改变的内容/ IP /端口等

的问候,
unruledboy_at_gmail_dot_com
http://www.xnlab.com:

|维克多谭
评论会员:更新完整的源代码包 时间:2011/11/29
阿尼尔孔雀
评论会员:游客 时间:2011/11/29
?它并不WiFi适配器捕获的数据包我们如何能做到这一点
?维克多谭
评论会员:游客 时间:2011/11/29
WIFI捕获,你需要设置混杂模式关闭。您可以修改源代码来实现
。TariqHussain
评论会员:游客 时间:2011/11/29
您好,,我wpuld想知道如何解码数据包使用UR项目。WinPcap的PLZ答复我尽快Thankx。
戴安娜费尔南德斯
评论会员:游客 时间:2011/11/29
喜我要使用C#开发网络嗅探器。我很新的网络编程。是否有必要,我使用WinPcap的吗?。NET提供了WinPcap的所有功能?的问候,戴安娜。在VB.NET2005年的数据包捕获的例子吗?请帮助我。很多的感谢。
兰寿panchu
评论会员:游客 时间:2011/11/29
您好,我曾尝试升级代码。NET2005,但我有一个例外,我没有克服。是有没有人在这里升级的实施,并可以把它在这里?谢谢!
兰寿panchu
评论会员:游客 时间:2011/11/29
这里是我的问题是,我得到异常的行:SOCKADDR=((dotnetWinpCap.sockaddr)(Marshal.PtrToStructure((System.IntPtr)pcap_addr.addr,typeof运算(dotnetWinpCap.sockaddr))));{BR}有谁知道什么是错的这个升级的?使用系统;使用System.Collections;使用System.Runtime.InteropServices;使用System.Text;使用的System.Threading;公共类设备{私人字符串名称;私人字符串描述;私人字符串的地址;私人字符串掩码;公共设备(){名称=NULL;描述=NULL;地址=NULL;NETMASK=NULL;返回}公共虚拟字符串名称{{返回的名称;}集合{名称=值;返回}}公共虚拟的字符串{得到{返回的描述;}集合{描述=值;返回}}公共虚拟字符串的地址{得到{返回地址;}集合{地址=值;返回}}公共虚拟字符串掩码{{返回掩码;}集合{NETMASK=值;返回}}}公共类dotnetWinpCap{公共类AlreadyOpenException:异常{公共AlreadyOpenException(){返回}公共覆盖字符串消息{得到{返回"设备连接对象已经打开关闭之前重新开放的第一。"}}}委托无效packet_handler(参数INT,INT头,INTpkt_data);公共枚举PCAP_NEXT_EX_STATE{成功=1,超时=0,ERROR=-1,EOF=​​-2,未知=-3,}公共委托无效ReceivePacket(对象发件人,PacketHeaderP,System.Byte[]S)委托无效DumpEnded(对象发件人);委托无效ReceivePacketInternal(对象发件人,INT头,int数据);[StructLayout(LayoutKind.Sequential)]公共的structpcap_pkthdr{公共dotnetWinpCap.timevalTS公共UInt32的caplen;公共UInt32的LEN;}[StructLayout(LayoutKind.Sequential)]公共timeval结构{公共UInt32的tv_sec;公共UInt32的tv_usec;​​} [StructLayout(LayoutKind.Sequential)]私人结构pcap_rmtauth{私人int类型;私人字符串用户名;私人字符串密码;}[StructLayout(LayoutKind.Sequential)]私人结构in_addr{公共字符B1;公共字符B2;公共字符B3公共字符B4公共UInt16的W1公共UInt16的W2公众的UInt64地址;}[StructLayout(LayoutKind.Sequential)]私人结构SOCKADDR公共短的家庭;公共UInt16的端口;公共字节[]地址;公共字节[]零;}[StructLayout(LayoutKind.Sequential)]私人结构pcap_addr{ 公众诠释;公众诠释地址;公共INT掩码;公众诠释broadaddr; 公众诠释dstaddr;}[StructLayout(LayoutKind.Sequential)]私人结构pcap_if{ 公众诠释;公共字符串名称;公共字符串描述; 公众诠释地址;公共UInt32的标志;}私人主题ListenThread私人BOOL处理;私人dotnetWinpCap.packet_handler回调;私人字符串FName参数私人INTmaxb;私人INTMAXP;私人BOOLm_islistening;私人BOOLm_isopen;私人字符串m_attachedDevice私人INTpcap_t;私人INT自卸;私人的StringBuildererrbuf;公共dotnetWinpCap(){ListenThread=NULL;出售=FALSE;回调=NULL; FName参数="";maxb=0;MAXP=0;m_islistening=FALSE;m_isopen=FALSE;m_attachedDevice=NULL; pcap_t=0;自卸=0;errbuf=新的StringBuilder(256)返回}公共虚拟字符串AttachedDevice{得到{ 返回m_attachedDevice;}}公共虚拟字符串LastError{得到{返回errbuf.ToString() }}公共虚拟BOOLIsListening{得到{返回m_islistening;}}公共虚拟BOOLISOPEN{得到{返回m_isopen;}}公共事件dotnetWinpCap.ReceivePacketOnReceivePacket;dotnetWinpCap.DumpEndedOnDumpEnded私人活动;私人活动dotnetWinpCap.ReceivePacketInternalOnReceivePacketInternal;[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_findalldevs(INTdevicelist文献,StringBuilder的errbuf);[DllImport("wpcap.dll的",SetLastError=FALSE)]私人静态外部INTpcap_setbuff(P,INTkernelbufferbytes);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_live_dump(P,字符串文件名,MAXSIZE,INTmaxpacks);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_live_dump_ended(INTP,INT同步);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态pcap_dump_open(P,字符串文件名);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部无效pcap_dump(INT自卸H,int数据)[DllImport("wpcap.dll的",SetLastError=FALSE)]私人静态外部无效pcap_dump_close(INT自卸);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_sendpacket(p,System.Byte[]的buff,int的大小);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_loop(P,CNT,dotnetWinpCap.packet_handler回调,INT用户);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_open_live(串设备,snaplen,PROMISCINTto_ms,StringBuilder的ebuf);[DllImport("wpcap.dll的",SetLastError=FALSE)]私人静态外部System.Byte[]pcap_next(P,INTpkt_header)[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_setmintocopy(P,int的大小);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部无效pcap_freealldevs(INTdevicelist);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部INTpcap_open(字符串源,snaplen,INT标志,read_timeout,AUTH,StringBuilder的errbuf);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态诠释pcap_next_ex(P,文献INTpkt_header,楼盘INTpacketdata);[DllImport("wpcap.dll的",SetLastError=FALSE)]私有静态外部无效pcap_close(P);[DllImport("KERNEL32",SetLastError=FALSE)]私人静态的externBOOLCloseHandle(INT处理);公共静态的ArrayListFindAllDevs(){ArrayList中的ArrayList;dotnetWinpCap.pcap_ifpcap_if;int的我;StringBuilder的StringBuilder的;INTI1;设备的设备;dotnetWinpCap.pcap_addrpcap_addr;dotnetWinpCap.sockaddrSOCKADDR;dotnetWinpCap.sockaddrsockaddr1; System.String[]ARR;ArrayList的=新的ArrayList();pcap_if.addresses=0;pcap_if.description=新的StringBuilder()toString()方法; pcap_if.flags=0;pcap_if.name=新的StringBuilder()toString()方法;pcap_if.next=0; =0;StringBuilder的=新的StringBuilder(256)I1=0;如果(dotnetWinpCap.pcap_findalldevs(参考我的StringBuilder)!=-1){ 转到ILO_006d;}返回null;ILO_006d:I1=I 转到ILO_026f;ILO_0075:新的设备装置=()arrayList.Add(设备); pcap_if=((dotnetWinpCap.pcap_if)(Marshal.PtrToStructure((System.IntPtr)我,typeof运算(dotnetWinpCap.pcap_if))));{BR} device.Name=pcap_if.name;device.Description=pcap_if.description;如果(pcap_if.addresses==0){转到ILO_0267; }pcap_addr=((dotnetWinpCap.pcap_addr)(Marshal.PtrToStructure((System.IntPtr)pcap_if.addresses,typeof运算(dotnetWinpCap.pcap_addr))));{BR}(pcap_addr.addr==0){转到ILO_01ab; }SOCKADDR=((dotnetWinpCap.sockaddr)(Marshal.PtrToStructure((System.IntPtr)pcap_addr.addr,typeof运算(dotnetWinpCap.sockaddr))));{BR}ARR=新的字符串[7]; ARR[0]=sockaddr.addr[0]的ToString();有用[1]=".";{BR}ARR[2]=sockaddr.addr[1]的ToString();有用[3]=".";{BR} 有用[4]=sockaddr.addr[2]的toString()有用[5]=".";{BR}有用[6]=sockaddr.addr[3]的ToString();device.Address=string.Concat(ARR);ILO_01ab:(pcap_addr.netmask==0){转到ILO_0267;}sockaddr1=((dotnetWinpCap.sockaddr)(Marshal.PtrToStructure(pcap_addr.netmask(System.IntPtr),typeof运算(dotnetWinpCap.sockaddr))));{BR}ARR=新的字符串[7]; ARR[0]=sockaddr1.addr[0]的ToString(); 有用[1]=".";{BR}ARR[2]=sockaddr1.addr[1]的ToString();有用[3]=".";{BR} 有用[4]=sockaddr1.addr[2]的toString() 有用[5]=".";{BR}有用[6]=sockaddr1.addr[3]的ToString();device.Netmask=string.Concat(ARR)ILO_0267:I=pcap_if.next;ILO_026f:(我!=0) {转到ILO_0075;}dotnetWinpCap.pcap_freealldevs(I1);返回的ArrayList;}公共虚拟BOOL打开(字符串源,snaplen,INT标志,read_timeout){如果((pcap_t!=0)==FALSE){转到ILO_0018;}抛出新dotnetWinpCap.AlreadyOpenException()ILO_0018:pcap_t=dotnetWinpCap.pcap_open(源,snaplen,旗帜,read_timeout,0,errbuf);(pcap_t==0){ 转到ILO_0050;}m_isopen=TRUE;m_attachedDevice=源;返回true;ILO_0050:m_isopen=FALSE; m_attachedDevice=NULL;返回false;}私人无效循环(){int的我;回调=新dotnetWinpCap.packet_handler(this.LoopCallback);=0;新HandleRef(回调(System.IntPtr)我);dotnetWinpCap.pcap_loop(pcap_t,回调,0,0);返回}私人无效LoopCallback(参数INT,INT头,INTpkt_data){ dotnetWinpCap.pcap_pkthdrpcap_pkthdrSystem.Byte[]ARR;Marshal.PtrToStringAnsi((System.IntPtr)参数);pcap_pkthdr=((dotnetWinpCap.pcap_pkthdr)(Marshal.PtrToStructure((System.IntPtr)头,typeof运算(dotnetWinpCap.pcap_pkthdr))));{BR}ARR=新字节[pcap_pkthdr.caplen]Marshal.Copy(pkt_data(System.IntPtr),ARR,0,(INT)pcap_pkthdr.caplen);Marshal.PtrToStringAnsi((System.IntPtr)pkt_data); 返回}私人BOOLOpenLive(字符串源,snaplen,PROMISCto_ms){pcap_t=dotnetWinpCap.pcap_open_live(源,snaplen,PROMISC,to_ms,errbuf);(pcap_t==0){转到ILO_0025;}返回true; ILO_0025:返回false;}私人dotnetWinpCap.PCAP_NEXT_EX_STATEReadNextInternal(出PacketHeaderp,出System.Byte[]packet_data,INTpkthdr出,出INTpktdata){int的我;dotnetWinpCap.pcap_pkthdrpcap_pkthdrpkthdr=0;pktdata=0;P=NULL;packet_data=NULL;(pcap_t!=0){ 转到ILO_003c;}errbuf=新的StringBuilder("没有适配器是目前开放");返回PCAP_NEXT_EX_STATE.ERROR;ILO_003c:I=dotnetWinpCap.pcap_next_ex(pcap_t,pkthdr文献,文献pktdata);(我!=0){ 转到ILO_0050;}返回0;ILO_0050:(我!=1){转到ILO_00cc;}pcap_pkthdr=((dotnetWinpCap.pcap_pkthdr)(Marshal.PtrToStructure((System.IntPtr)pkthdr,typeof运算(dotnetWinpCap.pcap_pkthdr))));{BR}P=新PacketHeader();p.Caplength=(INT)pcap_pkthdr.caplen;p.Length=(INT)pcap_pkthdr.len;p.ts=pcap_pkthdr.ts;packet_data=新的字节((System.UInt32)(p.Length))];{BR} Marshal.Copy(pktdata(System.IntPtr),packet_data,0,p.Length);返回PCAP_NEXT_EX_STATE.SUCCESS;ILO_00cc:(我!=-1){ 转到ILO_00d2;}返回PCAP_NEXT_EX_STATE.ERROR;ILO_00d2:(I=-2){转到ILO_00da; }返回PCAP_NEXT_EX_STATE.EOF; ILO_00da:返回PCAP_NEXT_EX_STATE.UNKNOWN;}公共虚拟dotnetWinpCap.PCAP_NEXT_EX_STATEReadNextInternal(出PacketHeaderp,出System.Byte[]packet_data){int的我;返回ReadNextInternal(P,出packet_data,出我了,我出来);}公共虚拟BOOLSendPacket(System.Byte[]packet_data)int的我;I=dotnetWinpCap.pcap_sendpacket(pcap_t,packet_data,packet_data.Length);(我!=0){转到ILO_0015;}返回true;ILO_0015:返回false;}私人无效MonitorDump(){如果(dotnetWinpCap.pcap_live_dump_ended(pcap_t,1)==0){转到ILO_0022;}如果(OnDumpEnded==NULL){转到ILO_0022;}OnDumpEnded.Invoke(本);ILO_0022:返回}私人无效DumpPacket(对象发件人,INT头,int数据){如果((自卸!=0)==FALSE){转到ILO_001f;}dotnetWinpCap.pcap_dump(自卸车,头,数据);ILO_001f:返回}公共虚拟无效StopDump(){dotnetWinpCapdotnetWinpCap;dotnetWinpCap=这;dotnetWinpCap.OnReceivePacketInternal=(Delegate.Remove(dotnetWinpCap.OnReceivePacketInternal,新dotnetWinpCap.ReceivePacketInternal(this.DumpPacket))作为dotnetWinpCap.ReceivePacketInternal)如果((自卸!=0)==FALSE){转到ILO_004a;}dotnetWinpCap.pcap_dump_close(翻斗车);自卸=0;ILO_004a:返回}公共虚拟BOOLStartDump(字符串文件名){BOOLBL; dotnetWinpCapdotnetWinpCap;如果((pcap_t!=0)==FALSE){转到ILO_004f;}尝试{ 自卸=dotnetWinpCap.pcap_dump_open(pcap_t,文件名); 转到ILO_002b;}赶上(System.Exception的OBJ){//obj的; BL=FALSE;转到ILO_0051; }ILO_002b:dotnetWinpCap=这;dotnetWinpCap.OnReceivePacketInternal=(Delegate.Combine(dotnetWinpCap.OnReceivePacketInternal,新dotnetWinpCap.ReceivePacketInternal(this.DumpPacket)dotnetWinpCap.ReceivePacketInternal))返回true;ILO_004f:返回false;ILO_0051: 返回"基本法";}私人BOOLStartLiveDump(字符串文件名,INTmaxbytes,INTmaxpackets){ FName参数=文件名;maxb=maxbytes; MAXP=maxpackets;如果(dotnetWinpCap.pcap_live_dump(pcap_t,FName参数,maxb,MAXP)=0){ 转到ILO_0048;}新的主题(新的ThreadStart(this.MonitorDump))返回true;ILO_0048:返回false;}公共虚拟INTSetMinToCopy(INT大小){ (dotnetWinpCap.pcap_setmintocopy(pcap_t,大小)!=0){转到ILO_0010;}返回1;ILO_0010:返回0;}私人无效ReadNextLoop(){PacketHeaderpacketHeader;System.Byte[]ARR;int的我;INTI1;dotnetWinpCap.PCAP_NEXT_EX_STATEpCAP_NEXT_EX_STATE; ILO_0000:packetHeader=NULL;ARR=NULL;pCAP_NEXT_EX_STATE=ReadNextInternal(出packetHeader出ARR,我出了I1);(pCAP_NEXT_EX_STATE!=PCAP_NEXT_EX_STATE.SUCCESS){ 转到ILO_0000;}(OnReceivePacket==NULL){转到ILO_002f;}OnReceivePacket.Invoke(packetHeader,ARR)ILO_002f:(OnReceivePacketInternal==NULL){转到ILO_0000;}OnReceivePacketInternal.Invoke(这一点,我,I1)转到ILO_0000;}公共虚拟BOOLSetKernelBuffer(INT字节){ 如果(dotnetWinpCap.pcap_setbuff(pcap_t,字节)==0) {转到ILO_0010;} 返回false;ILO_0010:返回true;}公共虚拟无效StartListen(){(ListenThread==NULL){ 转到ILO_0013;}ListenThread.Abort()ILO_0013:ListenThread=新主题(新的ThreadStart(this.ReadNextLoop));ListenThread.Start()m_islistening=; 返回}公共虚拟无效StopListen(){ (ListenThread==NULL){ 转到ILO_0027;}(ListenThread.IsAlive==FALSE){转到ILO_0020;}ListenThread.Abort() ILO_0020:ListenThread=NULL;ILO_0027:m_islistening=FALSE;返回}公共虚拟无效关闭(){StopDump()(IsListening==FALSE){转到ILO_0014;}StopListen()ILO_0014:m_isopen=FALSE;m_attachedDevice=NULL;如果((pcap_t!=0)==FALSE){转到ILO_004a;}dotnetWinpCap.pcap_close(pcap_t);pcap_t=0;ILO_004a: 返回}私人无效的Dispose(){的Dispose(TRUE);GC.SuppressFinalize(本);返回}私人无效的Dispose(BOOL处置){(销毁!=FALSE){转到ILO_005a; }(处置==FALSE){ 转到ILO_0032;}(ListenThread==NULL){转到ILO_0032; }(ListenThread.IsAlive==FALSE) {转到ILO_002b;} ListenThread.Abort()ILO_002b: ListenThread=NULL;ILO_0032: 如果((pcap_t!=0)==FALSE){转到ILO_005a;}dotnetWinpCap.pcap_close(pcap_t);pcap_t=0;ILO_005a:处置的=TRUE;返回}〜dotnetWinpCap(){尝试{的Dispose(假);转到ILO_0010;}最后{//base.Finalize()} ILO_0010:返回}}公共类PacketHeader{公共dotnetWinpCap.timevalTS私人INTcaplen;私人INTLEN公共PacketHeader(dotnetWinpCap.timevalTS,caplen,LEN){caplen=0;LEN=0;TS=TS;caplen=caplen;LEN=LEN返回}公共PacketHeader(){caplen=0;LEN=0;返回}公共虚拟INTCaplength{得到{返回caplen;}集合{caplen=值;返回}}公共虚拟INT长度{得到{返回len;}集合{LEN=值;返回}}公共虚拟的DateTime时间戳{得到{DateTime的日期时间;DateTime的dateTime1;dateTime1=新的DateTime(1970,1,1)为dateTime=dateTime1.AddSeconds(((System.Double)(ts.tv_sec)));{BR}dateTime.AddMilliseconds(((System.Double)(ts.tv_usec)));{BR}返回dateTime的;}}