110,538
社区成员
发帖
与我相关
我的任务
分享
public class SniffSocket
{
private Socket socket;
private byte[] receiveBufferBytes;
private int receiveBufferLength;
private bool keepRunning = true;
private SniffSocket()
{
receiveBufferLength = 4096;
receiveBufferBytes = new byte[receiveBufferLength];
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Blocking = false;
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.100"), 0));
}
public void Run()
{
//Socket开始异步监听数据包,并利用委托AsyncCallback
//在相应异步操作完成时调用CallReceive方法进行处理。
IAsyncResult ar = socket.BeginReceive(receiveBufferBytes, 0,
receiveBufferLength, SocketFlags.None,
new AsyncCallback(CallReceive), this);
}
private void CallReceive(IAsyncResult ar)
{
int receivedBytes;
receivedBytes = socket.EndReceive(ar);//结束挂起的异步读取
Receive(receiveBufferBytes, receivedBytes);//解析接收的数据包
if (keepRunning) Run();//继续侦听
}
private void Receive(byte[] buf, int len)
{
//解析接收到的数据包
}
}
public partial class Form1 : Form
{
private Socket socket;
public Form1()
{
InitializeComponent();
socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.142"),0));
}
private void Run()
{
byte[] data = new byte[4096];
int recv;
while (true)
{
try
{
recv = socket.Receive(data,SocketFlags.None);
for (int i = 0; i < recv; i++)
{
ShowString(string.Format("{0:X2} ",data[i]));
}
ShowString("\r\n");
}
catch (SocketException ex)
{
MessageBox.Show("Receive Thread Exception:\r\n"+ex.Message.ToString());
break;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
new Thread(Run).Start();
}
private void ShowString(string msg)
{
if (richTextBox1.IsDisposed)
return;
richTextBox1.AppendText(msg);
}
}