Не знаю, почему я получаю код ошибки 10022 (неверный аргумент) при настройке параметров сокета в моем C # сниффере - PullRequest
3 голосов
/ 28 февраля 2011

Я пишу анализатор пакетов в качестве упражнения для изучения разработки сокетов .Net 4 на C #.Моя цель - прослушивать IP-пакеты, входящие и выходящие из моего компьютера.

Моя проблема заключается в том, что я получаю код ошибки 10022, неверный аргумент, при моем вызове SetSocketOption.Я не вижу, где у меня неверный аргумент.У меня есть несколько администраторов на моем компьютере, но, возможно, мне не хватает.Это мой рабочий компьютер, а отдел ИТ довольно строг.С учетом сказанного, если бы это была проблема с разрешениями, я бы ожидал другое исключение.

Я не уверен, каким должен быть мой следующий шаг для устранения этой проблемы.У кого-нибудь есть идеи?

Вот следующий код:

public Sniffer()
{
    try
    {
        socket = new Socket(
            AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

        IPAddress[] ipAddresses = Dns.GetHostEntry(
            Dns.GetHostName()).AddressList;

        socket.Bind(new IPEndPoint(ipAddresses[0], 0));

        socket.SetSocketOption(
            SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);

        byte[] inputData = new byte[4] { 1, 0, 0, 0 };
        byte[] outValue = new byte[4];

        socket.IOControl(IOControlCode.ReceiveAll, inputData, outValue);
    }
    catch (SocketException ex)
    {
        string ErrorMessage = ex.Message;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 марта 2017

Из-за злоупотребления вирусами в начале 2000-х годов Microsoft ограничила использование необработанных сокетов в несерверных выпусках ОС Windows на всех ОС, более новых, чем XP SP2.

Вы можете узнать больше о том, какие ограничениянаходятся на странице Необработанные сокеты TCP / IP в MSDN.

0 голосов
/ 28 февраля 2011

WSAEINVAL 10022

Неверный аргумент.

Был указан некоторый недопустимый аргумент (например, указание недопустимого уровня для функции setsockopt). В некоторых случаях это также относится к текущему состоянию сокета, например, к вызову accept для сокета, который не прослушивает.

Посмотрите на эту ошибку здесь: http://msdn.microsoft.com/en-us/library/ms740668(v=vs.85).aspx

...