Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396

ping на go

18.03.2023, 11:24. Показов 1565. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста библиотеку ping'a со следующим функционалом:
1) Нужно иметь возможность изменять количество отправляемых ICMP пакетов.
2) Нужно получать результат пришедший от хоста в виде времени потраченного на ответ.

У Pinger'a я такого функционала не нашел.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.03.2023, 11:24
Ответы с готовыми решениями:

Есть ping по IP, нет ping по имени
Здравствуйте. Имею AD, DNS, DHCP, терминальная ферма, тонкие клиенты (всё введено в домен) Контроллер домена - ad.mydomen.local...

Ping
Здравствуйте, есть сервер windows server 2012(192.168.19.251) с отключенном брандауэром, без всякой защиты. Есть клиенты(windows xp, 7)...

ping - ping
В ВиртуалБоксе сделал 2 машины с RHEL 6, настроил интерфейсы eth0, eth1, отредактировал файл /etc/hosts следующим образом на обоих машинах ...

7
0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 3
18.03.2023, 18:18
Цитата Сообщение от Nesh Посмотреть сообщение
У Pinger'a я такого функционала не нашел.
А она - есть!
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
 
import (
    "fmt"
 
    probing "github.com/prometheus-community/pro-bing"
)
 
func main() {
    pinger, err := probing.NewPinger("www.google.com")
    if err != nil {
        panic(err)
    }
    pinger.Count = 4
    pinger.SetPrivileged(true)
 
    pinger.OnRecv = func(pkt *probing.Packet) {
        fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v\n",
            pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt)
    }
 
    pinger.OnDuplicateRecv = func(pkt *probing.Packet) {
        fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\n",
            pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.TTL)
    }
 
    pinger.OnFinish = func(stats *probing.Statistics) {
        fmt.Printf("\n--- %s ping statistics ---\n", stats.Addr)
        fmt.Printf("%d packets transmitted, %d packets received, %v%% packet loss\n",
            stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
        fmt.Printf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n",
            stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt)
    }
 
    fmt.Printf("PING %s (%s):\n", pinger.Addr(), pinger.IPAddr())
    err = pinger.Run()
    if err != nil {
        panic(err)
    }
}
Пример работы:
Code
1
2
3
4
5
6
7
8
9
10
# go run main.go 
PING www.google.com (216.58.209.164):
32 bytes from 216.58.209.164: icmp_seq=0 time=41.952187ms
32 bytes from 216.58.209.164: icmp_seq=1 time=43.753939ms
32 bytes from 216.58.209.164: icmp_seq=2 time=42.618594ms
32 bytes from 216.58.209.164: icmp_seq=3 time=43.217999ms
 
--- www.google.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 41.952187ms/42.88568ms/43.753939ms/672.133µs
0
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
18.03.2023, 18:34  [ТС]
Спасибо за ответ, но я столкнулся с новой проблемой. Когда pinger встречает ip который недоступен в сети, он будет вечно ждать ответа от него пока не нажать ctrl+c. Можно это как то обойти что бы например если хост не ответил в течении 5 секунд перейти к следующему хосту из списка?
0
0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 3
18.03.2023, 18:39
Установи ему Timeout. Будет не больше Timeout на хост.
0
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
18.03.2023, 18:42  [ТС]
Можно пример? Куда этот timeout вставить?
main.go
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
 
import "fmt"
 
func main() {
    var addresses = []string{"74.125.205.102", "77.88.55.60", "765.757.56.7", "192.168.1.132"}
    for _, addr := range addresses {
        err := Ping(addr, 2)
        if err != nil {
            fmt.Println(err)
        }
    }
 
}
ping.go
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main
 
import (
    "fmt"
    "os"
    "os/signal"
 
    "github.com/go-ping/ping"
)
 
func Ping(addr string, count int) (err error) {
    pinger := ping.New(addr)
 
    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)
    go func() {
        for _ = range c {
            pinger.Stop()
        }
    }()
    pinger.SetPrivileged(true)
    pinger.Count = count
    pinger.OnRecv = func(pkt *ping.Packet) {
        fmt.Printf("Принято %d байта от %s: номер пакета=%d время=%v\n",
            pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt)
    }
 
    pinger.OnFinish = func(stats *ping.Statistics) {
        fmt.Println("Статистика куба s/n:")
        fmt.Printf("%d переданно, %d получено, %v%% потеряно\n",
            stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
        fmt.Printf("Минимальное время жизни пакета для %v - %v\n", stats.IPAddr, stats.MinRtt)
        fmt.Printf("Максимальное время жизни пакета для %v - %v\n", stats.IPAddr, stats.MaxRtt)
    }
 
    fmt.Println("****************************************************************")
    fmt.Printf("-----------Ping %s:-----------\n", pinger.Addr())
    err = pinger.Run()
    if err != nil {
        fmt.Printf("Хост %v недоступен\n", pinger.Addr())
    }
    return err
}
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
18.03.2023, 18:47
Лучший ответ Сообщение было отмечено Nesh как решение

Решение

Цитата Сообщение от psergee2 Посмотреть сообщение
А она - есть!
А как ты понял, что это именно github.com/prometheus-community/pro-bing, а не https://github.com/raintank/go-pinger, например?

А вот у него github.com/go-ping/ping

Nesh, у тебя пакет старый, там же написано
Due to lack of maintainers and access, this library is no longer maintained. There is a new actively maintained fork: https://github.com/prometheus-community/pro-bing
Читать, вообще, полезно =)
https://github.com/prometheus-... ng.go#L126

Добавлено через 3 минуты
Но даже в старом пакете: https://github.com/go-ping/pin... ng.go#L127

Добавлено через 1 минуту
https://pkg.go.dev/github.com/... urce=godoc

Go
1
func (p *Pinger) Ping(address net.IP, count int, timeout time.Duration) (*PingStats, error)
1
0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 3
18.03.2023, 18:53
korvin_, привет. Никак. Я просто пробежался по линкам, по которым должен был пробежаться автор.
0
9 / 7 / 3
Регистрация: 25.06.2009
Сообщений: 396
18.03.2023, 20:14  [ТС]
korvin спасибо огромное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2023, 20:14
Помогаю со студенческими работами здесь

ping
как на форме, скажем в обычном Label'e, каждую секунду (или чаще) отображать время пинга до заранее известного хоста? аналогично той...

PING
Здравствуйте! Подскажите, пожалуйста, ping -n 3000 google.ru Пакетов: отправлено = 3000, получено = 2961, потеряно = 39 (1% потерь)...

Ping
Такой вопрос. Мне нужно написать программу что бы она проверяла пинг между двумя удаленными компьютерами. Реально ли это сделать? Если...

Ping
Плохой пинг к серверу при тесте с серверов по миру (Потери 40-100%). От чего это может зависеть, от провайдера или настроек самого...

Ping
Допустим я живу в Самаре,но мой 3g modem подключён к Саратовскому IP Где мне лучше искать игровые сервера в Саратове или Самаре,чтобы был...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru