使用SharpPcap截取网络上的数据包,目前可以截取到网络包的头部信息,如下代码:
private static void device_OnPacketArrival(object sender, CaptureEventArgs e) { var packet = PacketDotNet.Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var tcpPacket = PacketDotNet.TcpPacket.GetEncapsulated(packet); if (tcpPacket.DestinationPort == 80 || tcpPacket.SourcePort == 80) { // write the HTTP packet to the file captureFileWriter.Write(e.Packet); Console.WriteLine("Packet dumped to file."); } }
当e.Packet被写入的文件时,只有头部的相关信息,如Accept, Referer, User-Agent, Cookie等,但现在想知道通过HTTP上传文件的信息,比如当命令为POST时,filename字段的内容(应该是MIME部分的信息),但这个内容在e.Packet中找不到。貌似e.Packet无法截取到HTTP的数据信息。WireShark软件可以截取到,但不知道如何通过SharpPcap截取到。
有谁知道通过ShapPcap截取HTTP或者其它协议内的详细数据信息?
没研究过SharpPcap,但从你贴出来的代码来看,应该只是一个tcp packet的内容。
一次http请求是包含在连续多个报文中的,从一个包中是获取不到足够的信息的,自然无法解析出相应的内容,那些抓包软件应该中是已经将这些tcp报文的内容部分拼接后再展现出来的。
有启发。研究一下看看
http://www.cnblogs.com/armyao/archive/2010/11/05/1870165.html
http://www.cnblogs.com/armyao/archive/2010/11/05/1870166.html
http://www.cnblogs.com/armyao/archive/2010/11/05/1870164.html
问题解决:原来是中间有一个条件语句,判断是否是“POST”,如果是,才将Packet截取,但事实上,当命令为POST时,该Packet是不包括细节数据的,它只是一个文件上传时的第一个Packet。所以,要将所有的Packet截取或者把有filename的键截取,需要将“POST”的判断语句去掉或者屏蔽它作为唯一截取Packet的条件。