C# Socket Exception : an attempt was made to access a socket in a way forbidden by its access permissions

csockets

This is my code what I am using. This is the code I got from the internet, They said it is working fine. The comments for this also good but I don't understand why it is not working for me. And one more thing I am using this application as user mode not in a administrator mode.

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);
        }
    }

Best Answer

And one more thing I am using this application as user mode not in a administrator mode.

This can't work. The following is written for the Win32 api, but since that's what .NET calls down into, the same applies:

To use a socket of type SOCK_RAW requires administrative privileges. Users running Winsock applications that use raw sockets must be a member of the Administrators group on the local computer, otherwise raw socket calls will fail with an error code of WSAEACCES. On Windows Vista and later, access for raw sockets is enforced at socket creation. In earlier versions of Windows, access for raw sockets is enforced during other socket operations.

(my emphasis)