Подтвердить что ты не робот

Есть ли способ для вызова определенного IP-адреса с помощью C?

Есть ли способ для вызова определенного IP-адреса с помощью C? Если бы я захотел выполнить ping "www.google.com" с определенным количеством пингов или, если на то пошло, местным адресом, мне понадобилась бы программа для этого. Как я могу пинговать с C?

4b9b3361

Ответ 1

Пока нет ответа, и я наткнулся на этот вопрос, пытаясь сделать именно то, что было задано здесь, поэтому я хотел сослаться на ответ Aif .
Следующий код основывается на его примере и публикует общедоступный DNS Google в дочернем процессе и печатает результат в родительском процессе.

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

#define BUFLEN 1024

int main(int argc, char **argv)
{
    int pipe_arr[2];
    char buf[BUFLEN];

    //Create pipe - pipe_arr[0] is "reading end", pipe_arr[1] is "writing end"
    pipe(pipe_arr);

    if(fork() == 0) //child
    {
        dup2(pipe_arr[1], STDOUT_FILENO);
        execl("/sbin/ping", "ping", "-c 1", "8.8.8.8", (char*)NULL);    
    }
    else //parent
    {
        wait(NULL);
        read(pipe_arr[0], buf, BUFLEN);
        printf("%s\n", buf);

    }

    close(pipe_arr[0]);
    close(pipe_arr[1]);
    return 0;
}

Ответ 2

Вы можете создать свои собственные ICMP-пакеты, используя raw сокеты, но это далеко не тривиально. Исходный код для ping(1) - это хорошее место, чтобы начать выяснять, как это сделать (он использует BSD-подобную лицензию, см. исходный код для полной лицензии). Имейте в виду, что для сырых сокетов требуются привилегии root для Linux, поэтому ваша программа должна быть установлена ​​в root.

Конечно, гораздо проще вывести исполняемый файл ping(1) и не иметь дело с этим самим. Вам не придется беспокоиться о лицензировании кода, и вашей программе не понадобятся привилегии root (при условии, что они еще не нужны для чего-то еще). system(3), popen(3) и fork(3)/exec(3) являются вашими друзьями.

Ответ 3

Вам нужно будет изучить сокеты, разрешить хост, который вы хотите выполнить ping, отправить соответствующие пакеты ICMP и прослушать ответ. В стандартной библиотеке нет функции ping. Однако есть много сетевых библиотек более высокого уровня, которые уже реализуют протокол.