Сетевое программирование в .NET. Расшифровка IP-адреса (IP address specification). Обеспечение надежности доставки пакетов, страница 21

Выводимые результаты сильно зависят от того, в какой системе действует испытуемый компьютер. В системе со сложной конфигурацией на экран будет выведено довольно много данных. Если так, то стоит подумать о частичном выводе данных или разработке Windows-приложения, в котором информация будет отражаться в нескольких списках (элементах типа ListView).

Теперь добавим вывод реальной статистики, полученной с помощью объекта класса IPGlobalStatistics и его метода GetIPv4GlobalStatistics. Информация проходит через адаптер в двух направлениях, некоторые пакеты фрагментированы и нуждаются в процедуре восстановления (Reassembly), поэтому все статистические данные разделены на 4 группы (общие данные, данные о входящих пакетах, выходящих и фрагментированных пакетах).

Следующий код надо вставить в конец цикла прохода по адаптерам и использовать совместно с кодом, прозванивающим сервер, иначе (если нет подключения к Internet) статистика, может оказаться нулевой. Здесь используется ссылка p на объект класса IPGlobalProperties, которая была получена ранее.

IPGlobalStatistics st = p.GetIPv4GlobalStatistics();

Console.WriteLine("\n  Statistics\n  " + line.Substring(1, 10) +

"\n{0,-28}: {1}\n{2,-28}: {3}\n{4,-28}: {5}\n{6,-28}: {7}\n",

"  Interfaces", st.NumberOfInterfaces,

"  IP addresses", st.NumberOfIPAddresses,

"  Routes", st.NumberOfRoutes,

"  Default TTL", st.DefaultTtl);

Console.WriteLine("  Inbound Packet Data:\n  " + line.Substring(1, 20) +

"\n{0,-28}: {1}\n{2,-28}: {3}\n{4,-28}: {5}\n" +

"{6,-28}: {7}\n{8,-28}: {9}\n{10,-28}: {11}\n{12,-28}: {13}\n",

"\tReceived", st.ReceivedPackets,

"\tForwarded", st.ReceivedPacketsForwarded,

"\tDelivered", st.ReceivedPacketsDelivered,

"\tDiscarded", st.ReceivedPacketsDiscarded,

"\tHeader Errors", st.ReceivedPacketsWithHeadersErrors,

"\tAddress Errors", st.ReceivedPacketsWithAddressErrors,

"\tUnknown Protocol Errors", st.ReceivedPacketsWithUnknownProtocol);

Console.WriteLine("  Outbound Packet Data:\n  " + line.Substring(1, 21) +

"\n{0,-28}: {1}\n{2,-28}: {3}\n{4,-28}: {5}\n{6,-28}: {7}\n",

"\tRequested", st.OutputPacketRequests,

"\tDiscarded", st.OutputPacketsDiscarded,

"\tNo Routing Discards", st.OutputPacketsWithNoRoute,

"\tRouting Entry Discards", st.OutputPacketRoutingDiscards);

Console.WriteLine("  Reassembly Data:\n  " + line.Substring(1, 16) +

"\n{0,-28}: {1}\n{2,-28}: {3}\n{4,-28}: {5}\n" +

"{6,-28}: {7}\n{8,-28}: {9}\n",

"\tReassembly Timeout", st.PacketReassemblyTimeout,

"\tReassemblies Required", st.PacketReassembliesRequired,

"\tPackets Reassembled", st.PacketsReassembled,

"\tPackets Fragmented", st.PacketsFragmented,

"\tFragment Failures", st.PacketFragmentFailures);

Анализ полученных данных потребует времени и заметных усилий и вы, если надо, выполните его самостоятельно а сейчас отметим, что свойство PacketReassemblyTimeout показывает количество миллисекунд (60 в нашем случае), в течение которых должны прийти все части (фрагменты) расчлененного пакета. Если это не случится, то пакет будет забракован.

Рассмотрим, как использовать метод GetIcmpV4Statistics класса IcmpV4Statistics, а также его многочисленные свойства для получения статистики прохождения сообщений. Вставьте следующий код после цикла прохода по адаптерам, так как он не зависит от типа адаптера.

IcmpV4Statistics s = p.GetIcmpV4Statistics();

string snt = "Sent", rec = "Received";

Console.WriteLine("\n\nICMP V4 Statistics:" + line.Substring(0, 20) +

"\n{0,-28}{1}: {2,-10}{3}: {4,-10}\n" +

"{5,-28}{6}: {7,-10}{8}: {9,-10}\n" +

"{10,-28}{11}: {12,-10}{13}: {14,-10}\n" +

"{15,-28}{16}: {17,-10}{18}: {19,-10}\n" +

"{20,-28}{21}: {22,-10}{23}: {24,-10}\n" +