呵呵,忘记了 public delegate void newEventHandler(object sender, PacketArrivedEventArgs e); public class PacketArrivedEventArgs : System.EventArgs { public PacketArrivedEventArgs() { } public uint HeaderLength = 0; public string Protocol = String.Empty; public string IPVersion = String.Empty; public string OriginationAddress = String.Empty; public string OriginationPort = String.Empty; public string DestinationAddress = String.Empty; public string DestinationPort = String.Empty; public uint PacketLength = 0; public uint MessageLength = 0; public byte[] ReceiveBuffer = null; public byte[] IPHeaderBuffer = null; public byte[] MessageBuffer = null; }
/// <summary>
/// MyTryRaw 的摘要说明。
/// </summary>
public class MyTryRaw
{
#region Attributes
private bool error_occurred; //套接字在接收包时是否产生错误
private static int len_receive_buf; //得到的数据流的长度
private byte[] receive_buf_bytes = null; //收到的字节
private Socket socket = null; //声明套接字
private const int SIO_RCVALL = unchecked((int)0x98000001); //监听所有的数据包
public static bool isStop = false; public Socket m_socket
{
get
{
return socket;
}
} #endregion #region Events
public delegate void PacketArrivedEventHandler(Object sender, PacketArrivedEventArgs args); public event PacketArrivedEventHandler PacketArrival;
#endregion #region OnEvents
protected virtual void OnPacketArrival(PacketArrivedEventArgs e)
{
if (PacketArrival != null)
{
PacketArrival(this, e);
}
} #endregion #region Constructor
public MyTryRaw()
{
//
// TODO: 在此处添加构造函数逻辑
//
len_receive_buf = 4096;
receive_buf_bytes = new byte[len_receive_buf];
//PacketArrival += new PacketArrivedEventHandler(MyTryRaw_PacketArrival); }
#endregion #region Functions public void BindSocket()
{
//IPAddress ipAddress = IPAddress.Parse("192.168.10.233");
//this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
//Console.WriteLine("Start bind!");
//try
//{
// socket.Blocking = false;
// socket.Bind(new IPEndPoint(ipAddress, 80));
//}
//catch (Exception E)
//{
// throw (E);
//}
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Blocking = false; //置socket非阻塞状态
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.110"), 0)); //绑定套接字 if (SetSocketOption() == false) error_occurred = true; Console.WriteLine("Bind success!");
} public bool SetSocketOption()
{
bool ret_value = true;
try
{
//低级别操作模式,接受所有的数据包,这一步是关键,必须把socket设成raw和IP Level才可用SIO_RCVALL
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
byte[] IN = new byte[4] { 1, 0, 0, 0 };
byte[] OUT = new byte[4]; int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT);
ret_code = OUT[0] + OUT[1] + OUT[2] + OUT[3];//把4个8位字节合成一个32位整数
if (ret_code != 0) ret_value = false;
}
catch (SocketException)
{
ret_value = false;
}
return ret_value;
} public void ShutDown()
{
Console.WriteLine("Start ShutDown");
if (socket != null)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
socket = null;
Console.WriteLine("ShutDown Success");
} public void Receive(byte[] receivedBytes, int receivedLength)
{
PacketArrivedEventArgs e = new PacketArrivedEventArgs(); int IPVersion = Convert.ToInt16((receivedBytes[0] & 0xF0) >> 4);
e.IPVersion = IPVersion.ToString(); e.HeaderLength = Convert.ToUInt32((receivedBytes[0] & 0x0F) << 2); if (receivedBytes.Length >= 20)
{
switch (Convert.ToInt16(receivedBytes[9]))
{
case 1:
e.Protocol = "ICMP";
break;
case 2:
e.Protocol = "IGMP";
break;
case 6:
e.Protocol = "TCP";
break;
case 17:
e.Protocol = "UDP";
break;
default:
e.Protocol = "Unknow";
break;
} e.OriginationAddress = Convert.ToInt16(receivedBytes[12]).ToString() + "." + Convert.ToInt16(receivedBytes[13]).ToString() + "." + Convert.ToInt16(receivedBytes[14]).ToString() + "." + Convert.ToInt16(receivedBytes[15]).ToString();
e.OriginationPort = Oport.ToString(); int Dport = ((receivedBytes[22] << 8) + receivedBytes[23]);
e.DestinationPort = Dport.ToString(); e.PacketLength = (uint)receivedLength; e.MessageLength = e.PacketLength - e.HeaderLength; e.ReceiveBuffer = new byte[e.PacketLength];
e.IPHeaderBuffer = new byte[e.HeaderLength];
e.MessageBuffer = new byte[e.MessageLength]; Array.Copy(receivedBytes, 0, e.ReceiveBuffer, 0, (int)e.PacketLength); Array.Copy(receivedBytes, 0, e.IPHeaderBuffer, 0, e.HeaderLength); Array.Copy(receivedBytes, e.HeaderLength, e.MessageBuffer, 0, (int)e.MessageLength);
} OnPacketArrival(e);
if (eee != null)
{
eee(this, e);
} } public void BeginReceive()
{ if (socket != null)
{
object state = null;
state = socket;
socket.BeginReceive(receive_buf_bytes, 0, len_receive_buf, SocketFlags.None,
new AsyncCallback(CallReceive), this);
}
} private void CallReceive(IAsyncResult ar)//异步回调
{
int received_bytes = 0;
received_bytes = socket.EndReceive(ar);
Receive(receive_buf_bytes, received_bytes);
BeginReceive();
} public event newEventHandler eee; private void MyTryRaw_PacketArrival(object sender, PacketArrivedEventArgs e)
{ Console.WriteLine("Start Show-------------");
Console.WriteLine("HeaderLength: " + e.HeaderLength);
Console.WriteLine("IPHeader: ");
for (int i = 0; i < e.IPHeaderBuffer.Length; i++)
{
int j = i % 16;
if (i >= 16 && j == 0)
{
Console.WriteLine("\r\n");
} if (e.IPHeaderBuffer[i].ToString("X").Length != 1)
{
Console.Write("{0} ", e.IPHeaderBuffer[i].ToString("X"));
}
else
{
Console.Write("0{0} ", e.IPHeaderBuffer[i].ToString("X"));
} }
Console.WriteLine("\r\n"); Console.WriteLine("IPVersion: " + e.IPVersion);
Console.WriteLine("OriginAddress: " + e.OriginationAddress);
Console.WriteLine("OriginPort: " + e.OriginationPort);
Console.WriteLine("DestAddress: " + e.DestinationAddress);
Console.WriteLine("DestPort: " + e.DestinationPort);
Console.WriteLine("Protocol: " + e.Protocol); Console.WriteLine("PacketLength: " + e.PacketLength);
Console.WriteLine("Packet: ");
for (int i = 0; i < e.ReceiveBuffer.Length; i++)
{
int j = i % 16;
if (i >= 16 && j == 0)
{
Console.WriteLine("\r\n");
} if (e.ReceiveBuffer[i].ToString("X").Length != 1)
{
Console.Write("{0} ", e.ReceiveBuffer[i].ToString("X"));
}
else
{
Console.Write("0{0} ", e.ReceiveBuffer[i].ToString("X"));
}
}
Console.WriteLine("\r\n"); Console.WriteLine("MessageLength: " + e.MessageLength);
Console.WriteLine("Message: ");
for (int i = 0; i < e.MessageBuffer.Length; i++)
{
int j = i % 16;
if (i >= 16 && j == 0)
{
Console.WriteLine("\r\n");
}
if (e.MessageBuffer[i].ToString("X").Length != 1)
{
Console.Write("{0} ", e.MessageBuffer[i].ToString("X"));
}
else
{
Console.Write("0{0} ", e.MessageBuffer[i].ToString("X"));
}
}
Console.WriteLine("\r\n");
Console.WriteLine("----------------End Show!");
Console.WriteLine("----------------");
Console.WriteLine("\r\n");
Console.WriteLine("\r\n");
} #endregion
}
不过,我还有一个问题,你声明的委托中使用了PacketArrivedEventArgs类,这个类,应该是自定义的吧?但是,我不知道如何写。可以回复给我吗?谢了
public class PacketArrivedEventArgs : System.EventArgs
{
public PacketArrivedEventArgs()
{
}
public uint HeaderLength = 0;
public string Protocol = String.Empty;
public string IPVersion = String.Empty;
public string OriginationAddress = String.Empty;
public string OriginationPort = String.Empty;
public string DestinationAddress = String.Empty;
public string DestinationPort = String.Empty;
public uint PacketLength = 0;
public uint MessageLength = 0;
public byte[] ReceiveBuffer = null;
public byte[] IPHeaderBuffer = null;
public byte[] MessageBuffer = null;
}