// set the checksum field // offset points to the beginning of the IP header (!!!) // Should be called after the TCP header + data have been written public static void SetTcpChecksum(byte[] !packet, int ipOffset, ref TcpHeader tcpHeader) { // sum IP pseudo ushort ipPayloadLength = 0; ushort headerSum = IPFormat.SumPseudoHeader(packet, ipOffset, ref ipPayloadLength); int ipHeaderSize = (packet[ipOffset] & 0xf) * 4; int tcpOffset = ipOffset + ipHeaderSize; Debug.Assert(packet[tcpOffset + 16] == 0); Debug.Assert(packet[tcpOffset + 17] == 0); // now add it to the TCP header + data ushort payloadSum = IPFormat.SumShortValues(packet, tcpOffset, ipPayloadLength); tcpHeader.checksum = (ushort) ~(IPFormat.SumShortValues(headerSum, payloadSum)); // Complement and change +0 to -0 if needed. ushort tcpChecksum = IPFormat.ComplementAndFixZeroChecksum( (IPFormat.SumShortValues(headerSum, payloadSum))); tcpHeader.checksum = tcpChecksum; unchecked { packet[tcpOffset + 16] = (byte)(tcpChecksum >> 8); packet[tcpOffset + 17] = (byte)(tcpChecksum >> 0); } }
void getData(NetworkStream stream) { if (m_emptySpace < 512) { byte[] expand = new byte[m_size * 2]; for (int i = 0; i < m_size; i++) { expand[i] = m_field[i]; } m_field = expand; m_size = m_size * 2; } else { int transbyte; int cnt = this.getdatalength(); while (cnt < 8) { transbyte = stream.Read(m_field, m_front + 1, this.getfieldmaxaddress()); cnt += transbyte; addData(transbyte); } TcpHeader head = this.getheader(); while (head.msgsize < cnt) { transbyte = stream.Read(m_field, m_front + 1, this.getfieldmaxaddress()); cnt += transbyte; addData(transbyte); } } }
void rec(byte[] data, int length) { IPHeader ipHeader = new IPHeader(data, length); IPacket packet = ipHeader.ParseData(); if (OnPacket != null) { OnPacket(ipHeader.ProtocolType, packet); } if (OnTcpStream != null && ipHeader.ProtocolType == ProtocolType.Tcp) { TcpHeader tcp = (TcpHeader)packet; if (AllowTcpPacket(tcp)) { TcpStream stream = TcpStream.GetStream(_TcpStreams, tcp); if (stream != null) { if (stream.IsClossed) { _TcpStreams.Remove(stream); } OnTcpStream(stream); } } } Receive(); }
public void SerializeLocal(BinaryWriter writer) { //Check in sequence of headers.. FlagsByte bFlags = new FlagsByte(); if (IsUserMsg) { bFlags.SetOn(FlagsByte.Flag.TRANS); } object tmpHdr; tmpHdr = (Header)headers[(object)(HeaderType.REQUEST_COORELATOR)]; if (tmpHdr != null) { RequestCorrelator.HDR corHdr = (RequestCorrelator.HDR)tmpHdr; corHdr.SerializeLocal(writer); bFlags.SetOn(FlagsByte.Flag.COR); } tmpHdr = (Header)headers[(object)(HeaderType.TOTAL)]; if (tmpHdr != null) { TOTAL.HDR totalHdr = (TOTAL.HDR)tmpHdr; totalHdr.SerializeLocal(writer); bFlags.SetOn(FlagsByte.Flag.TOTAL); } tmpHdr = (Header)headers[(object)(HeaderType.TCP)]; if (tmpHdr != null) { TcpHeader tcpHdr = (TcpHeader)tmpHdr; tcpHdr.SerializeLocal(writer); bFlags.SetOn(FlagsByte.Flag.TCP); } writer.Write(Convert.ToInt16(prio)); writer.Write(handledAsynchronously); writer.Write(arrivalTime.Ticks); writer.Write(sendTime.Ticks); writer.Write(responseExpected); writer.Write(_type); if (stream != null) { writer.Write(length); writer.Write(((MemoryStream)stream).GetBuffer(), 0, length); } else { int length = buf.Length; writer.Write(length); writer.Write(buf); } long curPos = writer.BaseStream.Position; writer.BaseStream.Position = 8; //afte 4 bytes of total size and 4 bytes of message size ..here comes the flag. writer.Write(bFlags.DataByte); writer.BaseStream.Position = curPos; }
static void setHeader(TcpHeader head, Byte[] buff) { IntPtr ptr = Marshal.AllocHGlobal(8); Marshal.StructureToPtr(head, ptr, true); Marshal.Copy(ptr, buff, 0, 8); Marshal.FreeHGlobal(ptr); }
public TcpHeader getheader() { IntPtr ptr = Marshal.AllocHGlobal(m_headsize); Marshal.Copy(m_field, m_rear + 1, ptr, m_headsize); TcpHeader head = (TcpHeader)Marshal.PtrToStructure(ptr, typeof(TcpHeader)); Marshal.FreeHGlobal(ptr); return(head); }
static public TcpHeader getheader(byte[] buff, int headsize) { IntPtr ptr = Marshal.AllocHGlobal(headsize); Marshal.Copy(buff, 0, ptr, headsize); TcpHeader head = (TcpHeader)Marshal.PtrToStructure(ptr, typeof(TcpHeader)); Marshal.FreeHGlobal(ptr); return(head); }
public static bool IsChecksumValid(IPFormat.IPHeader !ipHeader, TcpHeader tcpHeader, NetPacket !payload) { // Compute partial checksums of headers ushort checksum = IPFormat.SumPseudoHeader(ipHeader); checksum = IPFormat.SumShortValues(checksum, SumHeader(tcpHeader)); // Checksum payload (without potential odd byte) int length = payload.Available; int end = length & ~1; int i = 0; uint payloadChecksum = 0; while (i != end) { byte b0 = payload.PeekAvailable(i++); byte b1 = payload.PeekAvailable(i++); payloadChecksum += ((((uint)b0) << 8) + (uint)b1); } // Handle odd byte. if (i != length) { payloadChecksum += (((uint)payload.PeekAvailable(i++)) << 8); } // Merge bits from payload checksum checksum = IPFormat.SumUInt16AndUInt32Values(checksum, payloadChecksum); // Complement and change +0 to -0 if needed. checksum = IPFormat.ComplementAndFixZeroChecksum(checksum); // Check for match. bool checksumMatch = (tcpHeader.checksum == checksum); // If checksum error, unconditionally output message to debugger. if (checksumMatch == false) { DebugStub.WriteLine("Bad TCP checksum {0:x4} != {1:x4}: SEQ {2:x8} ACK {3:x8}", __arglist(tcpHeader.checksum, checksum, tcpHeader.seq, tcpHeader.ackSeq )); } // IsValid is a Match. return(checksumMatch); }
void btn_join_Clicked(object sender, EventArgs arg) { // 띄어쓰기 등등 체크해야함. if (tb_Password.Text != tb_chkPassword.Text) { MessageBox.Show("비밀번호 확인 다시하세요", "비번체크"); } else { // 서버에 정보를 보낸후, TcpClient tc = new TcpClient("127.0.0.1", 7000); string msg = tb_ID.Text + " " + tb_Password.Text; byte[] bMsg = Encoding.Unicode.GetBytes(msg); TcpHeader head = new TcpHeader(); head.mode = 1; head.msgsize = (uint)szHeader + (uint)bMsg.Length; ByteField joinInfo = new ByteField(256); joinInfo.setHeader(head); joinInfo.ConcStrAfterHead(bMsg); NetworkStream stream = tc.GetStream(); stream.Write(joinInfo.m_field, 0, joinInfo.m_size); int cnt = 0; ByteField msgFromServ = new ByteField(bytesize); // 헤더수신보장 cnt += stream.Read(msgFromServ.m_field, 0, bytesize - cnt); while (cnt <= 8) { cnt += stream.Read(msgFromServ.m_field, cnt, bytesize - cnt); } int msgze = (int)msgFromServ.getheader().msgsize; while (cnt <= msgze) { cnt += stream.Read(msgFromServ.m_field, cnt, bytesize - cnt); } MessageBox.Show(msgFromServ.getMsgStr()); tc.Close(); stream.Close(); } this.Dispose(true); }
public BtcHeader(TcpHeader tcpHeader) { TcpHeader = tcpHeader; using (var memr = new MemoryStream(tcpHeader.Data.Array, tcpHeader.Data.Offset, tcpHeader.Data.Count)) { using (var reader = new BinaryReader(memr)) { Magic = reader.ReadUInt32(); Command = new String(reader.ReadChars(12)); Length = reader.ReadUInt32(); Checksum = reader.ReadUInt32(); Payload = new ArraySegment <byte>(tcpHeader.Data.Array, tcpHeader.Data.Offset + 24, (int)Length); } } }
bool AllowTcpPacket(TcpHeader tcp) { if (_Filters == null) { return(true); } foreach (ITcpStreamFilter filter in _Filters) { if (!filter.IsAllowed(tcp)) { return(false); } } return(true); }
static void getMSG(int headsize, NetworkStream stream, Byte[] buff, int buffsize) { int cnt = 0; while (cnt < 8) { cnt += stream.Read(buff, cnt, buffsize - cnt); } TcpHeader head = getheader(buff, headsize); while (cnt >= head.msgsize) { cnt += stream.Read(buff, cnt, buffsize - cnt); } }
public bool IsAllowed(TcpHeader packet) { TorHelper.UpdateTorExitNodeList(true); if (TorHelper.IsTorExitNode(packet.IpHeader.DestinationAddress)) { return(true); } if (TorHelper.IsTorExitNode(packet.IpHeader.SourceAddress)) { return(true); } return(false); }
/// <summary> /// Constructor /// </summary> /// <param name="packet">Packet</param> public TcpStream(TcpHeader packet) { if (packet != null) { _DestinationPort = packet.DestinationPort; _SourcePort = packet.SourcePort; _DestinationAddress = packet.IpHeader.DestinationAddress; _SourceAddress = packet.IpHeader.SourceAddress; Add(packet); } else { _IsClossed = true; } }
// construct a TCP header from a packet // if something is wrong, return the same start value public static bool ReadTcpHeader(IBuffer !buf, out TcpHeader tcphdr) { // initialize an TcpHeader struct tcphdr = new TcpHeader(); bool b; b = buf.ReadNet16(out tcphdr.sourcePort); b &= buf.ReadNet16(out tcphdr.destPort); b &= buf.ReadNet32(out tcphdr.seq); b &= buf.ReadNet32(out tcphdr.ackSeq); b &= buf.Read8(out tcphdr.off_res1); b &= buf.Read8(out tcphdr.res2_flags); b &= buf.ReadNet16(out tcphdr.window); b &= buf.ReadNet16(out tcphdr.checksum); b &= buf.ReadNet16(out tcphdr.urgPtr); return(b); }
private void AppendTCPInfo(TcpHeader tcpHeader, StringBuilder retVal) { //retVal.Append("[*TCP* "); //retVal.AppendFormat("SNo:{0}, " , tcpHeader.SequenceNumber); //if (tcpHeader.AcknowledgementNumber != "") //{ // retVal.AppendFormat("AckNo:{0} ,", tcpHeader.AcknowledgementNumber); //} //retVal.AppendFormat("HLen:{0}, " , tcpHeader.HeaderLength); //retVal.AppendFormat("Flags:{0}, " , tcpHeader.Flags); //retVal.AppendFormat("WSize:{0}, " , tcpHeader.WindowSize); //if (tcpHeader.UrgentPointer != "") //{ //retVal.AppendFormat("UPtr:{0}, ", tcpHeader.UrgentPointer); //} //retVal.AppendFormat("Checksum:{0}" , tcpHeader.Checksum); //retVal.Append("]"); }
public static ushort SumHeader(TcpHeader tcpHeader) { int checksum = tcpHeader.sourcePort; checksum += tcpHeader.destPort; checksum += (int)(tcpHeader.seq >> 16); checksum += (int)(tcpHeader.seq & 0xffff); checksum += (int)(tcpHeader.ackSeq >> 16); checksum += (int)(tcpHeader.ackSeq & 0xffff); checksum += (((int)tcpHeader.off_res1) << 8) | (int)tcpHeader.res2_flags; checksum += (int)tcpHeader.window; checksum += (int)tcpHeader.urgPtr; // Double-wrap checksum checksum = (checksum & 0xFFFF) + (checksum >> 16); checksum = (checksum & 0xFFFF) + (checksum >> 16); return((ushort)checksum); }
public void DeserializeLocal(BinaryReader reader) { isUserMsg = true; reader.BaseStream.Position = 0; byte flags = reader.ReadByte(); FlagsByte bFlags = new FlagsByte(); bFlags.DataByte = flags; //Headers are in sequence 1. COR 2. TOTAL 3. TCP headers = new Hashtable(); if (bFlags.AnyOn(FlagsByte.Flag.COR)) { RequestCorrelator.HDR corHdr = new RequestCorrelator.HDR(); corHdr.DeserializeLocal(reader); headers.Add(HeaderType.REQUEST_COORELATOR, corHdr); } if (bFlags.AnyOn(FlagsByte.Flag.TOTAL)) { TOTAL.HDR totalHdr = new TOTAL.HDR(); totalHdr.DeserializeLocal(reader); headers.Add(HeaderType.TOTAL, totalHdr); } if (bFlags.AnyOn(FlagsByte.Flag.TCP)) { TcpHeader tcpHdr = new TcpHeader(); tcpHdr.DeserializeLocal(reader); headers.Add(HeaderType.TCP, tcpHdr); } prio = (Priority)Enum.ToObject(typeof(Priority), reader.ReadInt16()); handledAsynchronously = reader.ReadBoolean(); long ticks = reader.ReadInt64(); arrivalTime = new DateTime(ticks); ticks = reader.ReadInt64(); sendTime = new DateTime(ticks); responseExpected = reader.ReadBoolean(); _type = reader.ReadByte(); length = reader.ReadInt32(); buf = (byte[])reader.ReadBytes(length); }
static void Main(string[] args) { var pcap = new Pcap(); pcap.Open(ConfigurationManager.AppSettings["Adapter"]); var address = IPAddress.Parse(ConfigurationManager.AppSettings["Address"]); var port = UInt16.Parse(ConfigurationManager.AppSettings["Port"]); Packet packet = null; long tx = 0, rx = 0; while (true) { if ((packet = pcap.Next()) != null) { var eth = new EthernetHeader(packet.Data); if (eth.Protocol == (int)EthernetProtocol.IP) { var ip = new IPHeader(eth); if (ip.Protocol == IPProtocol.Tcp) { var tcp = new TcpHeader(ip); if (ip.SourceIp.Equals(address) && tcp.SourcePort == port) { rx += tcp.Length; } else if (ip.DestinationIp.Equals(address) && tcp.DestinationPort == port) { tx += tcp.Length; } } } } if (KeyPressed()) { Console.WriteLine("{0},{1}", tx, rx); tx = 0; rx = 0; } } }
public void initData(string id, TcpClient tcp, string friendlist) { // 이것이 call되는 시점은 생성자call된 이후 시점. myId = id; connection = tcp; stream = tcp.GetStream(); int idx = 0; int cnt = 0; while (true) { idx = friendlist.IndexOf(' '); if (idx == -1) { break; } string name = friendlist.Substring(0, idx); friendlist = friendlist.Substring(idx); friendlist = friendlist.TrimStart(' '); BtnChatMemManager.getInstance().dicProfileList.Add(name, new ProFileEX(new Size(300, 50), new Point(0, 50 * cnt + 1), name, this)); // this.Size = new Size(300, 500); //lstCprofile.Add(new ProFileEX(new Size(300,50), new Point(0, 0), "정으니",this)); cnt++; } ByteField requestPendingMSg = new ByteField(8); TcpHeader head = new TcpHeader(); head.mode = 400; head.msgsize = 8; requestPendingMSg.setHeader(head); stream.Write(requestPendingMSg.m_field, 0, 8); Thread recv = new Thread(new ThreadStart(takeMsgFromServ)); Thread send = new Thread(new ThreadStart(sendMsgToServ)); recv.Start(); send.Start(); //test }
// writes a TCP header to a packet // return the next place to write to // the checksum must be later calculated and cover the // pseudoheader and entire TCP segment public static int WriteTcpHeader(byte[] !pkt, int offset, ref TcpHeader hdr) { // check we have enough packet space if (pkt.Length - offset < Size) { return(offset); } int o = offset; pkt[o++] = (byte)(((ushort)hdr.sourcePort) >> 8); pkt[o++] = (byte)(((ushort)hdr.sourcePort) & 0xff); pkt[o++] = (byte)(((ushort)hdr.destPort) >> 8); pkt[o++] = (byte)(((ushort)hdr.destPort) & 0xff); pkt[o++] = (byte)(((uint)hdr.seq) >> 24); pkt[o++] = (byte)(((uint)hdr.seq) >> 16); pkt[o++] = (byte)(((uint)hdr.seq) >> 8); pkt[o++] = (byte)(((uint)hdr.seq) & 0xff); pkt[o++] = (byte)(((uint)hdr.ackSeq) >> 24); pkt[o++] = (byte)(((uint)hdr.ackSeq) >> 16); pkt[o++] = (byte)(((uint)hdr.ackSeq) >> 8); pkt[o++] = (byte)(((uint)hdr.ackSeq) & 0xff); pkt[o++] = hdr.off_res1; pkt[o++] = hdr.res2_flags; pkt[o++] = (byte)(((ushort)hdr.window) >> 8); pkt[o++] = (byte)(((ushort)hdr.window) & 0xff); // checksum pkt[o++] = 0; pkt[o++] = 0; pkt[o++] = (byte)(((ushort)hdr.urgPtr) >> 8); pkt[o++] = (byte)(((ushort)hdr.urgPtr) & 0xff); return(o); }
public static TcpStream GetStream(List <TcpStream> streams, TcpHeader packet) { foreach (TcpStream stream in streams) { if (stream.IsSame(packet)) { stream.Add(packet); return(stream); } } if (packet.Data.Length == 0) { return(null); } TcpStream ret = new TcpStream(packet); streams.Add(ret); return(ret); }
public TCPDisplayPacket(IpV4Header ipHeader, TcpHeader tcpHeader) { Destination = ipHeader.DestinationAddress; DestinationPort = string.Format("{0} {1}", tcpHeader.DestinationPort, TCPPortLookup.GetPortName(tcpHeader.DestinationPort)); Source = ipHeader.SourceAddress; SourcePort = string.Format("{0} {1}", tcpHeader.SourcePort, TCPPortLookup.GetPortName(tcpHeader.SourcePort)); Type = ipHeader.ProtocolType; Flags = tcpHeader.Flags; SeqNumber = tcpHeader.SequenceNumber.ToString(); AckNumber = tcpHeader.AcknowledgementNumber; StringBuilder retVal = new StringBuilder(); if (tcpHeader.DestinationPort == 53 || tcpHeader.SourcePort == 53) { AppendDNSInfo(tcpHeader.Data, retVal); } AppendTCPInfo(tcpHeader, retVal); AppendIPInfo(ipHeader, retVal); AppendData(tcpHeader.Data, retVal); Data = retVal.ToString(); }
bool IsSame(TcpHeader packet) { //if (_SeqNumber != packet.SequenceNumber) // return false; // same if (packet.DestinationPort == _DestinationPort && packet.SourcePort == _SourcePort && IPAddress.Equals(packet.IpHeader.DestinationAddress, _DestinationAddress) && IPAddress.Equals(packet.IpHeader.SourceAddress, _SourceAddress)) { return(true); } // same if (packet.DestinationPort == _SourcePort && packet.SourcePort == _DestinationPort && IPAddress.Equals(packet.IpHeader.DestinationAddress, _SourceAddress) && IPAddress.Equals(packet.IpHeader.DestinationAddress, _SourceAddress)) { return(true); } return(false); }
void Add(TcpHeader packet) { if (packet.Flags.HasFlag(ETcpFlags.Fin)) { _IsClossed = true; } if (packet.Data.Length <= 0) { return; } ETcpEmisor emisor = (packet.DestinationPort == _DestinationPort && IPAddress.Equals(packet.IpHeader.DestinationAddress, _DestinationAddress) && packet.SourcePort == _SourcePort && IPAddress.Equals(packet.IpHeader.SourceAddress, _SourceAddress)) ? ETcpEmisor.A : ETcpEmisor.B; if (_Last == null) { _Last = new TcpStreamMessage(packet.Data, emisor); _InternalList.Add(_Last); } else { // Check if its the same if (_Last.Emisor == emisor) { _Last.AddData(packet.Data); } else { // New Packet _Last = new TcpStreamMessage(packet.Data, emisor); _InternalList.Add(_Last); } } }
public bool IsAllowed(TcpHeader packet) { return(packet.DestinationPort == Port || packet.SourcePort == Port); }
public void run() { while (true) { try { Packet packet = packetList.take(); EthernetPacket packet_eth = (EthernetPacket)packet; EthernetHeader head_eth = packet_eth.getHeader(); IpV4Packet ipV4Packet = null; if (ppp) { ipV4Packet = getIpV4Packet_pppoe(packet_eth); } else { if (packet_eth.getPayload() instanceof IpV4Packet) { ipV4Packet = (IpV4Packet)packet_eth.getPayload(); } } if (ipV4Packet != null) { IpV4Header ipV4Header = ipV4Packet.getHeader(); if (ipV4Packet.getPayload() instanceof TcpPacket) { TcpPacket tcpPacket = (TcpPacket)ipV4Packet.getPayload(); TcpHeader tcpHeader = tcpPacket.getHeader(); if (client) { TCPTun conn = tcpManager.getTcpConnection_Client(ipV4Header.getSrcAddr().getHostAddress(), tcpHeader.getSrcPort().value(), tcpHeader.getDstPort().value()); if (conn != null) { conn.process_client(capEnv, packet, head_eth, ipV4Header, tcpPacket, false); } } else { TCPTun conn = null; conn = tcpManager.getTcpConnection_Server(ipV4Header.getSrcAddr().getHostAddress(), tcpHeader.getSrcPort().value()); if ( tcpHeader.getDstPort().value() == listenPort) { if (tcpHeader.getSyn() && !tcpHeader.getAck() && conn == null) { conn = new TCPTun(capEnv, ipV4Header.getSrcAddr(), tcpHeader.getSrcPort().value()); tcpManager.addConnection_Server(conn); } conn = tcpManager.getTcpConnection_Server(ipV4Header.getSrcAddr().getHostAddress(), tcpHeader.getSrcPort().value()); if (conn != null) { conn.process_server(packet, head_eth, ipV4Header, tcpPacket, true); } } } } else if (packet_eth.getPayload() instanceof IllegalPacket) { MLog.println("IllegalPacket!!!"); } } } catch (InterruptedException e) {
/// <summary> /// 抓包 /// </summary> /// <param name="s"></param> private void CatchPacket(Object s) { Socket ss = s as Socket;//参数转换 byte[] buffer = new byte[2400];//接收数据的缓冲区 while (true) { if (count > 80000) break; int j = ss.Receive(buffer);//接收数据 if (j > 0)//若接收到数据包 { IPHeader ipheader = new IPHeader(buffer, j); ListViewItem lv = new ListViewItem();//定义一个视图项 count += j;//count用于统计接收的总字节数 lv.Text = ipheader.srcAddr.ToString();//往视图项添加源IP lv.SubItems.Add(ipheader.destAddr.ToString());//往视图项添加目的IP if (ipheader.protocol == 6)//6代表TCP { byte[] tcp = new byte[ipheader.length - ipheader.IPlength]; Array.Copy(buffer, ipheader.IPlength, tcp, 0, j - ipheader.IPlength); TcpHeader tcpHeader = new TcpHeader(tcp, j);//解析TCP报文 lv.SubItems.Add(tcpHeader.sourcePort.ToString()); lv.SubItems.Add(tcpHeader.destinationPort.ToString()); lv.SubItems.Add("TCP"); ListViewItem tcpListView = new ListViewItem(); tcpListView.Text = tcpHeader.sourcePort.ToString(); tcpListView.SubItems.Add(tcpHeader.destinationPort.ToString()); tcpListView.SubItems.Add(tcpHeader.seq.ToString()); tcpListView.SubItems.Add(tcpHeader.ack.ToString()); tcpListView.SubItems.Add(tcpHeader.dataOffset.ToString()); tcpListView.SubItems.Add(tcpHeader.win.ToString()); this.listView2.Items.Add(tcpListView); // if (tcpHeader.destinationPort == 80) // { string str = Encoding.UTF8.GetString(buffer,40,j-40); this.richTextBox1.AppendText("\r\n" + str); // } } else if (ipheader.protocol == 17) {//17代表UDP报文 byte[] udp = new byte[ipheader.length - ipheader.IPlength]; Array.Copy(buffer, ipheader.IPlength, udp, 0, j - ipheader.IPlength); UdpHeader udpHeader = new UdpHeader(udp, j);//解析UDP报文 lv.SubItems.Add(udpHeader.sourcePort.ToString()); lv.SubItems.Add(udpHeader.destinationPort.ToString()); lv.SubItems.Add("UDP"); } else {//其他协议 lv.SubItems.Add(" "); lv.SubItems.Add(" "); lv.SubItems.Add("Others"); } lv.SubItems.Add((ipheader.length).ToString()); lv.SubItems.Add(count.ToString()); this.listView1.Items.Add(lv); } } }
public void Execute() { Packet packet; EthernetHeader eth; IPHeader ip; Flow key = new Flow(); FlowStats stats; try { //BinaryReader log = new BinaryReader(new FileStream(@"c:\users\gavin\desktop\20081006.dat", FileMode.Open, FileAccess.Read)); while (!terminated) { try { /*packet = new Packet(); * packet.Time = log.ReadInt64(); * packet.Length = log.ReadInt32(); * packet.Data = log.ReadBytes(log.ReadInt32());*/ packet = pcap.Next(); } catch (Exception e) { packet = null; throw; } if (packet != null) { if (dump != null) { dump.Write(packet.Time); dump.Write(packet.Length); int i = Math.Min(packet.Data.Length, 64); dump.Write(i); dump.Write(packet.Data, 0, i); dump.Flush(); } eth = new EthernetHeader(packet.Data); if (eth.Protocol == (int)EthernetProtocol.IP) { ip = new IPHeader(eth); if (ip.Protocol == IPProtocol.Tcp) { TcpHeader tcp = new TcpHeader(ip); key = new Flow(ip, tcp); stats = tracker.Resolve(key, packet.Time); stats.Last = packet.Time; stats.Packets++; // Bytes at IP, including IP header stats.Bytes += ip.Length; #region debugging /* * // TODO: Verify sorted order of queue - should be right now * FlowStats check = queue.Head; * while (check != null) { * if (check.Next != null) Debug.Assert(check.Last >= check.Next.Last); * check = check.Next; * } */ #endregion } else if (ip.Protocol == IPProtocol.Udp) { try { UdpHeader udp = new UdpHeader(ip); key = new Flow(ip, udp); stats = tracker.Resolve(key, packet.Time); stats.Last = packet.Time; stats.Packets++; // Bytes at IP, including IP header stats.Bytes += ip.Length; } catch (IndexOutOfRangeException e) { using (StreamWriter errorLog = new StreamWriter(Path.Combine(LogFolder, "error.log"), true)) { errorLog.WriteLine(DateTime.Now); errorLog.WriteLine(e.Message); errorLog.WriteLine(e.StackTrace); errorLog.WriteLine(); } if (dump != null) { dump.Write(packet.Time); dump.Write(packet.Length); dump.Write(packet.Data.Length); dump.Write(packet.Data, 0, packet.Data.Length); dump.Flush(); } } catch (Exception ex) { } } else if (ip.Protocol == IPProtocol.Icmp) { // TODO: Deal with ICMP } else if (ip.Protocol == IPProtocol.Gre) { // TODO: Deal with GRE } } else { // TODO: deal with non-IP } #region Age flows /**/ while (tracker.Count > 0 && tracker.Tail.Last < packet.Time - ExpiryInterval) { stats = tracker.Tail; Dump(stats); tracker.Remove(stats); } writer.Flush(); /**/ #endregion } packets++; } } catch (EndOfStreamException e) { // TODO: nothing } catch (Exception e) { //debug.WriteLine("ERROR: " + e.Message); //debug.Flush(); throw e; } }
public void Assign(IPHeader ip, TcpHeader tcp) { Source = new IPEndPoint(ip.SourceIp, tcp.SourcePort); Destination = new IPEndPoint(ip.DestinationIp, tcp.DestinationPort); Protocol = ip.Protocol; }
/// <summary> /// 抓包 /// </summary> /// <param name="s"></param> private void CatchPacket(Object s) { Socket ss = s as Socket; //参数转换 byte[] buffer = new byte[2400]; //接收数据的缓冲区 while (true) { if (count > 80000) { break; } int j = ss.Receive(buffer); //接收数据 if (j > 0) //若接收到数据包 { IPHeader ipheader = new IPHeader(buffer, j); ListViewItem lv = new ListViewItem(); //定义一个视图项 count += j; //count用于统计接收的总字节数 lv.Text = ipheader.srcAddr.ToString(); //往视图项添加源IP lv.SubItems.Add(ipheader.destAddr.ToString()); //往视图项添加目的IP if (ipheader.protocol == 6) //6代表TCP { byte[] tcp = new byte[ipheader.length - ipheader.IPlength]; Array.Copy(buffer, ipheader.IPlength, tcp, 0, j - ipheader.IPlength); TcpHeader tcpHeader = new TcpHeader(tcp, j); //解析TCP报文 lv.SubItems.Add(tcpHeader.sourcePort.ToString()); lv.SubItems.Add(tcpHeader.destinationPort.ToString()); lv.SubItems.Add("TCP"); ListViewItem tcpListView = new ListViewItem(); tcpListView.Text = tcpHeader.sourcePort.ToString(); tcpListView.SubItems.Add(tcpHeader.destinationPort.ToString()); tcpListView.SubItems.Add(tcpHeader.seq.ToString()); tcpListView.SubItems.Add(tcpHeader.ack.ToString()); tcpListView.SubItems.Add(tcpHeader.dataOffset.ToString()); tcpListView.SubItems.Add(tcpHeader.win.ToString()); this.listView2.Items.Add(tcpListView); // if (tcpHeader.destinationPort == 80) // { string str = Encoding.UTF8.GetString(buffer, 40, j - 40); this.richTextBox1.AppendText("\r\n" + str); // } } else if (ipheader.protocol == 17) {//17代表UDP报文 byte[] udp = new byte[ipheader.length - ipheader.IPlength]; Array.Copy(buffer, ipheader.IPlength, udp, 0, j - ipheader.IPlength); UdpHeader udpHeader = new UdpHeader(udp, j); //解析UDP报文 lv.SubItems.Add(udpHeader.sourcePort.ToString()); lv.SubItems.Add(udpHeader.destinationPort.ToString()); lv.SubItems.Add("UDP"); } else {//其他协议 lv.SubItems.Add(" "); lv.SubItems.Add(" "); lv.SubItems.Add("Others"); } lv.SubItems.Add((ipheader.length).ToString()); lv.SubItems.Add(count.ToString()); this.listView1.Items.Add(lv); } } }