На всякий случай отстальная часть кода
(к логике работы самого icmp не относится).

#include <error.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <resolv.h>
#include <netinet/ip_icmp.h>

#define PACKETSIZE  64

void usage()
{
    printf("USAGE:\t  prog_name <IP_address>\n");
    exit(1);
}


int main(int argc, char *argv[])
{
    if(argv[1] == NULL)
        usage();

    if (ping(argv[1]) > 0)
        printf("PING\t\tOK\n");
    else
        printf("PING\t\tNO_ANSWER\n");

    return 0;
}



2014-11-21 14:15 GMT+01:00 Alex Naumov <alexander_naumov@opensuse.org>:
Всем привет.

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

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

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

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

Alex


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