Привет 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.