Click here to Skip to main content
15,897,187 members
Articles / Web Development / HTML

SharpPcap - A Packet Capture Framework for .NET

,
Rate me:
Please Sign up or sign in to vote.
4.94/5 (192 votes)
5 May 2014MPL21 min read 2.1M   10.3K   518  
A framework for capturing, injecting and analyzing network packets for .NET applications based on the WinPcap packet capture driver
// $Id: UDPPacket.java,v 1.18 2004/05/05 23:14:45 pcharles Exp $

/// <summary>************************************************************************
/// Copyright (C) 2001, Patrick Charles and Jonas Lehmann                   *
/// Distributed under the Mozilla Public License                            *
/// http://www.mozilla.org/NPL/MPL-1.1.txt                                *
/// *************************************************************************
/// </summary>
namespace Tamir.IPLib.Packets
{
	using System;
	using AnsiEscapeSequences = Tamir.IPLib.Packets.Util.AnsiEscapeSequences_Fields;
	using ArrayHelper = Tamir.IPLib.Packets.Util.ArrayHelper;
	using Timeval = Tamir.IPLib.Packets.Util.Timeval;
	/// <summary> A UDP packet.
	/// <p>
	/// Extends an IP packet, adding a UDP header and UDP data payload.
	/// *
	/// </summary>
	/// <author>  Patrick Charles and Jonas Lehmann
	/// </author>
	/// <version>  $Revision: 1.18 $
	/// @lastModifiedBy $Author: pcharles $
	/// @lastModifiedAt $Date: 2004/05/05 23:14:45 $
	/// 
	/// </version>
	[Serializable]
	public class UDPPacket:IPPacket, UDPFields/* ,System.Runtime.Serialization.ISerializable*/
	{
		/// <summary> Fetch the port number on the source host.
		/// </summary>
		virtual public int SourcePort
		{
			get
			{
				return ArrayHelper.extractInteger(_bytes, _ipOffset + Tamir.IPLib.Packets.UDPFields_Fields.UDP_SP_POS, Tamir.IPLib.Packets.UDPFields_Fields.UDP_PORT_LEN);
			}
			
		}
		/// <summary> Fetch the port number on the target host.
		/// </summary>
		virtual public int DestinationPort
		{
			get
			{
				return ArrayHelper.extractInteger(_bytes, _ipOffset + Tamir.IPLib.Packets.UDPFields_Fields.UDP_DP_POS, Tamir.IPLib.Packets.UDPFields_Fields.UDP_PORT_LEN);
			}
			
		}
		/// <summary> Fetch the total length of the UDP packet, including header and
		/// data payload, in bytes.
		/// </summary>
		override public int Length
		{
			get
			{
				// should produce the same value as header.length + data.length
				return ArrayHelper.extractInteger(_bytes, _ipOffset + Tamir.IPLib.Packets.UDPFields_Fields.UDP_LEN_POS, Tamir.IPLib.Packets.UDPFields_Fields.UDP_LEN_LEN);
			}
			
		}
		/// <summary> Fetch the header checksum.
		/// </summary>
		virtual public int UDPChecksum
		{
			get
			{
				return ArrayHelper.extractInteger(_bytes, _ipOffset + Tamir.IPLib.Packets.UDPFields_Fields.UDP_CSUM_POS, Tamir.IPLib.Packets.UDPFields_Fields.UDP_CSUM_LEN);
			}
			
		}
		/// <summary> Fetch the header checksum.
		/// </summary>
		override public int Checksum
		{
			get
			{
				return UDPChecksum;
			}
			
		}
		/// 
		/// <summary> Fetch the UDP header a byte array.
		/// </summary>
		virtual public byte[] UDPHeader
		{
			get
			{
				if (_udpHeaderBytes == null)
				{
					_udpHeaderBytes = PacketEncoding.extractHeader(_ipOffset, Tamir.IPLib.Packets.UDPFields_Fields.UDP_HEADER_LEN, _bytes);
				}
				return _udpHeaderBytes;
			}
			
		}
		/// <summary> Fetch the UDP header as a byte array.
		/// </summary>
		override public byte[] Header
		{
			get
			{
				return UDPHeader;
			}
			
		}
		/// <summary> Fetch the UDP data as a byte array.
		/// </summary>
		virtual public byte[] UDPData
		{
			get
			{
				if (_udpDataBytes == null)
				{
					// set data length based on info in headers (note: tcpdump
					//  can return extra junk bytes which bubble up to here
					int tmpLen = _bytes.Length - _ipOffset - Tamir.IPLib.Packets.UDPFields_Fields.UDP_HEADER_LEN;
					_udpDataBytes = PacketEncoding.extractData(_ipOffset, Tamir.IPLib.Packets.UDPFields_Fields.UDP_HEADER_LEN, _bytes, tmpLen);
				}
				return _udpDataBytes;
			}
			
		}
		/// <summary> Fetch the UDP data as a byte array.
		/// </summary>
		override public byte[] Data
		{
			get
			{
				return UDPData;
			}
			
		}
		/// <summary> Fetch ascii escape sequence of the color associated with this packet type.
		/// </summary>
		override public System.String Color
		{
			get
			{
				return AnsiEscapeSequences.LIGHT_GREEN;
			}
			
		}
		/// <summary> Create a new UDP packet.
		/// </summary>
		public UDPPacket(int lLen, byte[] bytes):base(lLen, bytes)
		{
		}
		
		/// <summary> Create a new UDP packet.
		/// </summary>
		public UDPPacket(int lLen, byte[] bytes, Timeval tv):this(lLen, bytes)
		{
			this._timeval = tv;
		}
		
		
		
		
		
		
		private byte[] _udpHeaderBytes = null;
		
		
		private byte[] _udpDataBytes = null;
		
		
		/// <summary> Convert this UDP packet to a readable string.
		/// </summary>
		public override System.String ToString()
		{
			return toColoredString(false);
		}
		
		/// <summary> Generate string with contents describing this UDP packet.
		/// </summary>
		/// <param name="colored">whether or not the string should contain ansi
		/// color escape sequences.
		/// 
		/// </param>
		public override System.String toColoredString(bool colored)
		{
			System.Text.StringBuilder buffer = new System.Text.StringBuilder();
			buffer.Append('[');
			if (colored)
				buffer.Append(Color);
			buffer.Append("UDPPacket");
			if (colored)
				buffer.Append(AnsiEscapeSequences.RESET);
			buffer.Append(": ");
			buffer.Append(SourceAddress);
			buffer.Append('.');
			buffer.Append(IPPort.getName(SourcePort));
			buffer.Append(" -> ");
			buffer.Append(DestinationAddress);
			buffer.Append('.');
			buffer.Append(IPPort.getName(DestinationPort));
			buffer.Append(" l=" + Tamir.IPLib.Packets.UDPFields_Fields.UDP_HEADER_LEN + "," + (Length - Tamir.IPLib.Packets.UDPFields_Fields.UDP_HEADER_LEN));
			buffer.Append(']');
			
			return buffer.ToString();
		}
		
		
		
		private System.String _rcsid = "$Id: UDPPacket.java,v 1.18 2004/05/05 23:14:45 pcharles Exp $";
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Mozilla Public License 1.1 (MPL 1.1)


Written By
Software Developer
Israel Israel
Works as a Network Engineer for a leading networking company.

Written By
United States United States
Entrepreneur and product developer with a wide range of technical and business experience.

Comments and Discussions