Есть ли способ для вызова определенного IP-адреса с помощью C? Если бы я захотел выполнить ping "www.google.com" с определенным количеством пингов или, если на то пошло, местным адресом, мне понадобилась бы программа для этого. Как я могу пинговать с C?
Есть ли способ для вызова определенного IP-адреса с помощью C?
Ответ 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
. Однако есть много сетевых библиотек более высокого уровня, которые уже реализуют протокол.
Ответ 4
Это просто самое простое, что я нашел.
http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/commands/simple/ping.c