Отправка UDP-пакета в Go
Отправка на известный хост начинается с
строки адреса в формате хост и порт через
двоеточие. Удобный путь: открыть соединение
для протокола udp и дальше писать
в него байты как в поток, хотя по сути
каждая запись уходит отдельной датаграммой.
Откроем связь с "127.0.0.1:9091"
и отправим короткую строку:
package main
import (
"fmt"
"net"
)
func main() {
conn, err := net.Dial("udp", "127.0.0.1:9091")
if err != nil {
fmt.Println("dial error")
return
}
defer conn.Close()
_, err = conn.Write([]byte("ping"))
if err != nil {
fmt.Println("write error")
return
}
fmt.Println("sent")
}
На экране "sent". Если на порту
никто не слушает, запись все равно может
пройти: протокол не подтверждает, что
пакет кто-то принял.
Тот же адрес можно разобрать в структуру и открыть низкоуровневый сокет, если нужен именно тип для датаграмм:
package main
import (
"fmt"
"net"
)
func main() {
raddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9091")
if err != nil {
fmt.Println("resolve error")
return
}
conn, err := net.DialUDP("udp", nil, raddr)
if err != nil {
fmt.Println("dial error")
return
}
defer conn.Close()
_, err = conn.Write([]byte("ping"))
if err != nil {
fmt.Println("write error")
return
}
fmt.Println("sent")
}
Дано сообщение:
msg := []byte("hello")
Отправьте msg на "127.0.0.1:9091"
через Dial и напечатайте "ok"
при успешной записи.
Дан адрес:
target := "127.0.0.1:9091"
Разберите target в структуру адреса
и откройте сокет для записи одного пакета
со строкой "probe".
Скажите, чем запись через открытое для
udp соединение отличается от
долгого потока TCP, если смотреть только
на сторону отправителя.