LINUX.ORG.RU

ping generation


0

0

Как программно эмулировать ping ? есть ли какие-либо C(C++)-ые библиотеки, которые это облегчают ?

anonymous

[root@murr root]# ltrace -f -o ping.ltrace ping localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.195 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.179 ms

--- localhost.localdomain ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1015ms
rtt min/avg/max/mdev = 0.179/0.187/0.195/0.008 ms
[root@murr root]# cat ping.ltrace
12116 __libc_start_main(0x08049190, 2, 0xbffffa64, 0x08048ccc, 0x0804e0c4 <unfinished ...>
12116 __fxstat(3, 0, 0xbffff850)                  = 0
12116 __fxstat(3, 1, 0xbffff850)                  = 0
12116 __fxstat(3, 2, 0xbffff850)                  = 0
12116 socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)     = 3
12116 __errno_location()                          = 0x40138060
12116 getuid()                                    = 0
12116 setgroups(0, 0, 2, 0xbffff8c0, 0x40039709)  = 0
12116 getpwnam("iputils")                         = 0x401395bc
12116 endpwent()                                  = <void>
12116 chroot("/var/resolv")                       = 0
12116 chdir("/")                                  = 0
12116 setgid(104)                                 = 0
12116 setuid(104)                                 = 0
12116 getopt(2, 0xbffffa64, "h?VQ:I:M:aUc:dfi:w:l:S:np:qrs:vL"...) = -1
12116 inet_aton("localhost", 0x08060df8)          = 0
12116 gethostbyname("localhost")                  = 0x4013a474
12116 strncpy(0xbffff9c0, "localhost.localdomain", 63) = 0xbffff9c0
12116 socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)     = 4
12116 connect(4, 0xbffff980, 16, 0x40020000, 3)   = 0
12116 getsockname(4, 0x08060de4, 0xbffff908, 0x40020000, 3) = 0
12116 close(4)                                    = 0
12116 setsockopt(3, SOL_RAW, ICMP_FILTER, 0xbffff904, 4)        = 0
12116 setsockopt(3, SOL_IP, IP_RECVERR, 0xbffff900, 4)         = 0
12116 setsockopt(3, SOL_SOCKET, SO_SNDBUF, 0x08062e80, 4)          = 0
12116 setsockopt(3, SOL_SOCKET, SO_RCVBUF, 0xbffff8a8, 4)          = 0
12116 getsockopt(3, SOL_SOCKET, SO_RCVBUF, 0xbffff8a8, 0xbffff8a4) = 0
12116 malloc(192)                                 = 0x08064950
12116 inet_ntoa(0x0100007f)                       = "127.0.0.1"
12116 printf("PING %s (%s) ", "localhost.localdomain", "127.0.0.1") = 39
12116 printf("%d(%d) bytes of data.\n", 56, 84)   = 22
12116 setsockopt(3, SOL_SOCKET, SO_TIMESTAMP, 0xbffff888, 4)         = 0
12116 setsockopt(3, SOL_SOCKET, SO_SNDTIMEO, 0xbffff880, 8)         = 0
12116 setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, 0xbffff880, 8) = 0
12116 getpid()                                    = 12116
12116 memset(0xbffff7a0, '\000', 140)             = 0xbffff7a0
12116 sigaction(2, 0xbffff7a0, 0, 0x077905a6, 0x0804bc80) = 0
12116 memset(0xbffff7a0, '\000', 140)             = 0xbffff7a0
12116 sigaction(14, 0xbffff7a0, 0, 0x077905a6, 0x0804bc80) = 0
12116 memset(0xbffff7a0, '\000', 140)             = 0xbffff7a0
12116 sigaction(3, 0xbffff7a0, 0, 0x077905a6, 0x0804bc90) = 0
12116 gettimeofday(0x08062e58, NULL)              = 0
12116 isatty(1)                                   = 1
12116 ioctl(1, 21523, 0xbffff878)                 = 0
12116 gettimeofday(0x08060e2c, NULL)              = 0
12116 gettimeofday(0xbfffe768, NULL)              = 0
12116 sendmsg(3, 0x08050804, 0, 0, 0)             = 64
12116 recvmsg(3, 0xbfffe800, 0, 0, 0)             = 84
etc

Проще только system ("ping"); ;)

Murr ★★
()

Енто верно, в socket.h прототипы функций API - на пол машинного экрана код будет для icmp.

P.S: а ltrace - фича забавная, не видел раньше - но теперь оценил

anonymous
()
Ответ на: комментарий от anonymous

Ok. Спасибо.

а можешь это в виде примера на C прислать ? - из вывода разбираться сложно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.