[求助]原始套接字监听IP数据包

codeos 2014-12-28 10:59:19
1. 用异步方式监听IP数据包

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)
{
//解析接收到的数据包
}
}

//-------------------------------------------------------------------------------------------------------------
以上代码是可以正常运行的




然后,我把[color=#FFFF00]socket.Blocking=false;
注释掉,改成用同步方式来Receive()侦听接收,程序就无法接收到数据包了,原始套接字不能用同步方式来接收数据包么?
[/color]


...全文
235 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36175361 2017-03-04
  • 打赏
  • 举报
回复
楼主有没有完整的代码,拷到电脑上就可以直接运行的那种
codeos 2014-12-29
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
那就贴出来.否则谁知道为什么,靠猜吗
不好意思。。。 重新又写了遍代码,同步方式又能侦听数据了。。。
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);
        }
    }
於黾 2014-12-29
  • 打赏
  • 举报
回复
那就贴出来.否则谁知道为什么,靠猜吗
codeos 2014-12-29
  • 打赏
  • 举报
回复
同步方式的代码我没贴出来
codeos 2014-12-29
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
[quote=引用 3 楼 codeos 的回复:] [quote=引用 2 楼 Z65443344 的回复:] Blocking指的是阻塞,非阻塞,并不是同步异步 建议还是查MSDN恶补一下 你把它设置为阻塞,然后又使用异步方式,当然是不行的
设置为阻塞,用同步方式不行么?[/quote] 你的代码是异步方式啊 还是系统的了解一下什么是同步方式,什么是异步方式吧 并不是你把socket设置为阻塞模式,它就是同步方式了[/quote] 嗯,代码写的是异步方式,运行没问题的情况;然后“改成用同步方式来Receive()侦听接收” 我用socket.Receive()阻塞的同步方式来接收数据,没有任何数据?
於黾 2014-12-29
  • 打赏
  • 举报
回复
引用 3 楼 codeos 的回复:
[quote=引用 2 楼 Z65443344 的回复:] Blocking指的是阻塞,非阻塞,并不是同步异步 建议还是查MSDN恶补一下 你把它设置为阻塞,然后又使用异步方式,当然是不行的
设置为阻塞,用同步方式不行么?[/quote] 你的代码是异步方式啊 还是系统的了解一下什么是同步方式,什么是异步方式吧 并不是你把socket设置为阻塞模式,它就是同步方式了
codeos 2014-12-29
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
Blocking指的是阻塞,非阻塞,并不是同步异步 建议还是查MSDN恶补一下 你把它设置为阻塞,然后又使用异步方式,当然是不行的
设置为阻塞,用同步方式不行么?
於黾 2014-12-29
  • 打赏
  • 举报
回复
Blocking指的是阻塞,非阻塞,并不是同步异步 建议还是查MSDN恶补一下 你把它设置为阻塞,然后又使用异步方式,当然是不行的
codeos 2014-12-28
  • 打赏
  • 举报
回复
顶一个

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧