using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Threading;
namespace Demo.WindowsForms
{
class Program
{
///
/// The main entry point for the application.
///
///
// Instantiate the communications port
private SerialPort port = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
static MainForm windowGUI;
[STAThread]
static void Main()
{
Application.SetCompatibleTextRenderingDefault(false);
var program = new Program();
windowGUI = new MainForm();
program.SerialInitialize();
Application.EnableVisualStyles();
Application.Run(windowGUI);
}
//inits the serial port and event handler
private void SerialInitialize()
{
// http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx
// Attach a method to be called when there is data waiting in the port's buffer
port.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
// Open the port for communications
port.Open();
}
//process received data
private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
// Show all the incoming data in the port's buffer
string testChk = port.ReadLine();
windowGUI.ParseIncomingData(testChk);
}
}
public class Dummy
{
}
class IpInfo
{
public string Ip;
//public int Port;
//public TcpState State;
//public string ProcessName;
public string CountryName;
public string RegionName;
public string City;
public double Latitude;
public double Longitude;
public DateTime CacheTime;
//public DateTime StatusTime;
//public bool TracePoint;
}
struct IpStatus
{
private string countryName;
public string CountryName
{
get
{
return countryName;
}
set
{
countryName = value;
}
}
private int connectionsCount;
public int ConnectionsCount
{
get
{
return connectionsCount;
}
set
{
connectionsCount = value;
}
}
}
class DescendingComparer : IComparer
{
public bool SortOnlyCountryName = false;
public int Compare(IpStatus x, IpStatus y)
{
int r = 0;
if(!SortOnlyCountryName)
{
r = y.ConnectionsCount.CompareTo(x.ConnectionsCount);
}
if(r == 0)
{
return x.CountryName.CompareTo(y.CountryName);
}
return r;
}
}
class TraceRoute
{
readonly static string Data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
readonly static byte[] DataBuffer;
readonly static int timeout = 8888;
static TraceRoute()
{
DataBuffer = Encoding.ASCII.GetBytes(Data);
}
public static List GetTraceRoute(string hostNameOrAddress)
{
var ret = GetTraceRoute(hostNameOrAddress, 1);
return ret;
}
private static List GetTraceRoute(string hostNameOrAddress, int ttl)
{
List result = new List();
using(Ping pinger = new Ping())
{
PingOptions pingerOptions = new PingOptions(ttl, true);
PingReply reply = pinger.Send(hostNameOrAddress, timeout, DataBuffer, pingerOptions);
//Debug.WriteLine("GetTraceRoute[" + hostNameOrAddress + "]: " + reply.RoundtripTime + "ms " + reply.Address + " -> " + reply.Status);
if(reply.Status == IPStatus.Success)
{
result.Add(reply);
}
else if(reply.Status == IPStatus.TtlExpired)
{
// add the currently returned address
result.Add(reply);
// recurse to get the next address...
result.AddRange(GetTraceRoute(hostNameOrAddress, ttl + 1));
}
else
{
Debug.WriteLine("GetTraceRoute: " + hostNameOrAddress + " - " + reply.Status);
}
}
return result;
}
}
#if !MONO
#region Managed IP Helper API
public struct TcpTable : IEnumerable
{
#region Private Fields
private IEnumerable tcpRows;
#endregion
#region Constructors
public TcpTable(IEnumerable tcpRows)
{
this.tcpRows = tcpRows;
}
#endregion
#region Public Properties
public IEnumerable Rows
{
get
{
return this.tcpRows;
}
}
#endregion
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
return this.tcpRows.GetEnumerator();
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return this.tcpRows.GetEnumerator();
}
#endregion
}
public struct TcpRow
{
#region Private Fields
private IPEndPoint localEndPoint;
private IPEndPoint remoteEndPoint;
private TcpState state;
private int processId;
#endregion
#region Constructors
public TcpRow(IpHelper.TcpRow tcpRow)
{
this.state = tcpRow.state;
this.processId = tcpRow.owningPid;
int localPort = (tcpRow.localPort1 << 8) + (tcpRow.localPort2) + (tcpRow.localPort3 << 24) + (tcpRow.localPort4 << 16);
long localAddress = tcpRow.localAddr;
this.localEndPoint = new IPEndPoint(localAddress, localPort);
int remotePort = (tcpRow.remotePort1 << 8) + (tcpRow.remotePort2) + (tcpRow.remotePort3 << 24) + (tcpRow.remotePort4 << 16);
long remoteAddress = tcpRow.remoteAddr;
this.remoteEndPoint = new IPEndPoint(remoteAddress, remotePort);
}
#endregion
#region Public Properties
public IPEndPoint LocalEndPoint
{
get
{
return this.localEndPoint;
}
}
public IPEndPoint RemoteEndPoint
{
get
{
return this.remoteEndPoint;
}
}
public TcpState State
{
get
{
return this.state;
}
}
public int ProcessId
{
get
{
return this.processId;
}
}
#endregion
}
public static class ManagedIpHelper
{
public static readonly List TcpRows = new List();
#region Public Methods
public static void UpdateExtendedTcpTable(bool sorted)
{
TcpRows.Clear();
IntPtr tcpTable = IntPtr.Zero;
int tcpTableLength = 0;
if(IpHelper.GetExtendedTcpTable(tcpTable, ref tcpTableLength, sorted, IpHelper.AfInet, IpHelper.TcpTableType.OwnerPidConnections, 0) != 0)
{
try
{
tcpTable = Marshal.AllocHGlobal(tcpTableLength);
if(IpHelper.GetExtendedTcpTable(tcpTable, ref tcpTableLength, true, IpHelper.AfInet, IpHelper.TcpTableType.OwnerPidConnections, 0) == 0)
{
IpHelper.TcpTable table = (IpHelper.TcpTable)Marshal.PtrToStructure(tcpTable, typeof(IpHelper.TcpTable));
IntPtr rowPtr = (IntPtr)((long)tcpTable + Marshal.SizeOf(table.Length));
for(int i = 0; i < table.Length; ++i)
{
TcpRows.Add(new TcpRow((IpHelper.TcpRow)Marshal.PtrToStructure(rowPtr, typeof(IpHelper.TcpRow))));
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(typeof(IpHelper.TcpRow)));
}
}
}
finally
{
if(tcpTable != IntPtr.Zero)
{
Marshal.FreeHGlobal(tcpTable);
}
}
}
}
#endregion
}
#endregion
#region P/Invoke IP Helper API
///
///
///
public static class IpHelper
{
#region Public Fields
public const string DllName = "iphlpapi.dll";
public const int AfInet = 2;
#endregion
#region Public Methods
///
///
///
[DllImport(IpHelper.DllName, SetLastError = true)]
public static extern uint GetExtendedTcpTable(IntPtr tcpTable, ref int tcpTableLength, bool sort, int ipVersion, TcpTableType tcpTableType, int reserved);
#endregion
#region Public Enums
///
///
///
public enum TcpTableType
{
BasicListener,
BasicConnections,
BasicAll,
OwnerPidListener,
OwnerPidConnections,
OwnerPidAll,
OwnerModuleListener,
OwnerModuleConnections,
OwnerModuleAll,
}
#endregion
#region Public Structs
///
///
///
[StructLayout(LayoutKind.Sequential)]
public struct TcpTable
{
public uint Length;
public TcpRow row;
}
///
///
///
[StructLayout(LayoutKind.Sequential)]
public struct TcpRow
{
public TcpState state;
public uint localAddr;
public byte localPort1;
public byte localPort2;
public byte localPort3;
public byte localPort4;
public uint remoteAddr;
public byte remotePort1;
public byte remotePort2;
public byte remotePort3;
public byte remotePort4;
public int owningPid;
}
#endregion
}
#endregion
#endif
}