Привет Alex. Может имеет смысл создать репозиторий на github или еще где. Что б можно было сразу примеры-задачки сливать, собирать, вносить правки. Я это предлагаю в контексте
Кто что думает об этом коде? Что можно улучшить?
Что б можно было создавать бранчи с решениям, которые по мнению конкретного взятого разработчика улучшают код. И затем обсуждать.
И всегда можно будет в переписке ссылаться на нужный коммит/ветку.
Это только предложение. А не условие.

Анализируя пристегнутый код письму могу только пока предложить вариант ответа к следующему вопросу
Кто-нибудь может ясно объяснить, почему для корректной работы он требует права root?
Тут я немного схитрил, что б получить ответ.
Рута запрашивает на
 sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

А стандартный системный ping - нет. Поэтому не долго думая, слил исходники пакета busybox (очень советую скачать всем, кто хочет в полной мере на примере изучать разработку  системного ПО) и начал сравнивать нашей реализации Ping с тем что представлено в нем.

Сокет создается там примерно так же. Но идет проверка, что если сокет не создался, то идет проверка на права доступа со следующей припиской.
* We don't have root privileges.  Try SOCK_DGRAM instead.
         * Linux needs net.ipv4.ping_group_range for this to work.
         * MacOSX allows ICMP_ECHO, ICMP_TSTAMP or ICMP_MASKREQ
         */
Гугл по запросу ping_group_range

Выдал такой результат.

Socket(2) is restricted to the group range specified in
"/proc/sys/net/ipv4/ping_group_range" (or the owner of CAP_NET_RAW).  It
is "1 0" by default, meaning that nobody except root may create ping
sockets.  Setting it to "100 100" would gain permissions to the single
group, "0 65535" would enable it for the world.

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


21.11.2014 16:15, Alex Naumov пишет:
Всем привет.

Начнем потихоньку? Вот [1] пример функции, которая отправляет 4 ICMP запроса (raw-сокет).
В качестве аргумента передаем ей строку с IP адресом.
Если получено больше одного ответа, то функция возвращает положительный ответ.
Предпологается, что функция используется по аналогии с ping(8).

Кто что думает об этом коде? Что можно улучшить?

Мне вот интересно, сколько по-вашему стоит получить ответов, чтобы быть уверенным, что
сеть работет без проблем и задержка с ответами не слишком большая?

Кто-нибудь может ясно объяснить, почему для корректной работы он требует права root?

Alex


[1] http://goo.gl/2eAH4C


_______________________________________________
Kernel-russian mailing list
Kernel-russian@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernel-russian