C#Socketexception:尝试以其访问权限禁止的方式访问套接字

这是我正在使用的代码。 这是我从互联网上获得的代码,他们说它工作正常。 对此的评论也很好,但我不明白为什么它不适合我。 还有一件事我使用此应用程序作为用户模式而不是管理员模式。

private void btnStart_Click(object sender, EventArgs e) { if (cmbInterfaces.Text == "") { MessageBox.Show("Select an Interface to capture the packets.", "MJsniffer", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } try { if (!bContinueCapturing) { //Start capturing the packets... btnStart.Text = "&Stop"; bContinueCapturing = true; //For sniffing the socket to capture the packets has to be a raw socket, with the //address family being of type internetwork, and protocol being IP Console.WriteLine("1"); mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); Console.WriteLine("2"); //Bind the socket to the selected IP address mainSocket.Bind(new IPEndPoint(IPAddress.Parse(cmbInterfaces.Text), 0)); Console.WriteLine("3"); //Set the socket options mainSocket.SetSocketOption(SocketOptionLevel.IP, //Applies only to IP packets SocketOptionName.HeaderIncluded, //Set the include the header true); //option to true Console.WriteLine("4"); byte[] byTrue = new byte[4] {1, 0, 0, 0}; byte[] byOut = new byte[4]{1, 0, 0, 0}; //Capture outgoing packets //Socket.IOControl is analogous to the WSAIoctl method of Winsock 2 mainSocket.IOControl(IOControlCode.ReceiveAll, //Equivalent to SIO_RCVALL constant //of Winsock 2 byTrue, byOut); //Start receiving the packets asynchronously mainSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null); } else { btnStart.Text = "&Start"; bContinueCapturing = false; //To stop capturing the packets close the socket mainSocket.Close (); } } catch (SocketException ex) { Console.WriteLine("5"); MessageBox.Show(ex.Message, "MJsniffer", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { Console.WriteLine("6"); MessageBox.Show(ex.Message, "MJsniffer", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 

还有一件事我使用此应用程序作为用户模式而不是管理员模式。

这不行。 以下是针对Win32 api编写的,但由于这是.NET调用的内容,同样适用:

要使用SOCK_RAW类型的套接字,需要管理权限。 运行使用原始套接字的Winsock应用程序的用户必须是本地计算机上Administrators组的成员 ,否则原始套接字调用将失败,错误代码为WSAEACCES 。 在Windows Vista及更高版本中,在创建套接字时强制访问原始套接字。 在早期版本的Windows中,在其他套接字操作期间强制访问原始套接字。

我的重点

你能检查一下SocketException.SocketErrorCode并更新你的问题吗?
我假设您收到10013 – 这些是代码说明 。 很可能其他一些应用程序正在访问套接字或者您的权限丢失,