Отслеживание трафика IGMP

#c# #sockets #igmp

#c# #сокеты #igmp

Вопрос:

Я создал библиотеку для работы с IGMP. Теперь, глупость в том, что моя библиотека также выполняет мониторинг присутствия, чтобы убедиться, что другие все еще являются частью группы.

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

Я мог бы сделать все намного чище (и я бы не стал изобретать велосипед), если бы мог использовать эти пакеты.

У кого-нибудь есть опыт в этом? Может быть, создать какой-то сумасшедший сокет? Я не хочу использовать libpcap для этого. Я не думаю, что язык имеет значение, если это возможно с использованием сокетов в Windows / Linux

Комментарии:

1. AFAIK, для такого уровня доступа НЕ существует чистого решения .NET / Mono … лучшим выбором является драйвер, который интегрируется с сетевым стеком … такой драйвер может быть написан с использованием C

2. Это, вероятно, возможно с использованием необработанных сокетов. IOControlCode. ReceiveAllIgmpMulticast все еще исследует

Ответ №1:

Хорошо, нашел способ. Сейчас это очень грязно, так как мне приходится извлекать нужную мне информацию вручную, но, по сути, именно так вы извлекаете данные IGMP из интерфейса (обратите внимание, что для извлечения необработанных данных у вас должны быть права администратора):

 var buffer = new byte[65536];
var s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Igmp); // filter out non IGMP
byte[] one = BitConverter.GetBytes(1);
s.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.148"), 0)); // Which interface to listen on
s.IOControl(IOControlCode.ReceiveAll, one, one); // enter promiscuous mode
s.Recieve(buffer); // get yourself some data (BeginRecieve didn't seem to work here)
  

затем сделайте что-нибудь с указанным буфером. Если вы ткнете в wireshark, вы увидите разбивку пакетов

Комментарии:

1. Кроме того, 65536 огромен. Из-за того, где эти сообщения находятся в стеке IP, их число должно фактически соответствовать размеру вашего MTU. Я думаю, что 9K — это максимум сейчас?