Исключение сокета Packet Sniffer - PullRequest
1 голос
/ 25 октября 2010

На следующий код

        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
        s.Bind(new System.Net.IPEndPoint(IPAddress.Parse("127.0.0.1"),0));
        s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
        byte[] bin = new byte[4]{1, 0, 0, 0};
        byte[] bout = new byte[4];
        s.IOControl(IOControlCode.ReceiveAll, bin, bout);

Я получаю следующее исключение:

Socket Exception: An invalid argument was supplied

На следующей строке

        s.IOControl(IOControlCode.ReceiveAll, in, out);

Но я не понимаю, почему я привел неверный аргумент.

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

Хорошо, я нашел это.

127.0.0.1 - неправильная аннотация IP-адреса для этого.Я должен использовать свой локальный (192.168.0.100);

Черт, это всегда так легко.

1 голос
/ 25 октября 2010

См. Статью MSDN и документ IOControl , специально для .ReceiveAll:

Включение приема всех пакетов IPv4 в сети.Сокет должен иметь семейство адресов InterNetwork, тип сокета должен быть Raw, а тип протокола должен быть IP.Текущий пользователь должен принадлежать к группе администраторов на локальном компьютере, а сокет должен быть привязан к определенному порту.Этот управляющий код поддерживается в Windows 2000 и более поздних операционных системах.Это значение равно константе SIO_RCVALL в Winsock 2. Константа SIO_RCVALL в Winsock 2.

Возможно, вы не в группе администраторов или привязаны к неверному порту?Кажется, вы правильно установили другие параметры.Хотя, сказав все это, ваш код выглядит идентично этому примеру , поэтому он должен работать?Можете ли вы углубиться в исключение, чтобы прочитать, возможно, более подробные внутренние исключения?

...