#go
#Вперед
Вопрос:
Раньше я читал и записывал UDP
сообщения, используя net.UDPConn
where, который я мог использовать SetReadBuffer
для изменения размера буфера приема ОС.
Поскольку мне нужно иметь возможность устанавливать TTL
для UDP
пакетов, которые отправляет мое приложение, я перехожу к ipv4
пакету, где у меня более низкий уровень доступа к IP-сокетам, и я могу установить TTL
для исходящих сообщений.
Но я понятия не имею, как изменить размер буфера чтения на ipv4.PacketConn
.
Реализация SetReadBuffer
установки буфера с использованием файлового дескриптора соединения возможно ли что-то подобное с ipv4.PacketConn
помощью?
Комментарии:
1. Я предполагаю, что один из способов решить эту проблему — изменить размер буфера по умолчанию на хост-компьютере. Довольно часто размеры по умолчанию и max устанавливаются на одно и то же значение, и изменение размера с помощью программы приводит
SetReadBuffer
только к тому, что размер устанавливается на меньшее значение.
Ответ №1:
Вот как вы могли бы это сделать на golang 1.11 и выше на платформе unix:
package main
import (
"context"
"fmt"
"net"
"syscall"
"golang.org/x/sys/unix"
)
func control(network, address string, c syscall.RawConn) error {
c.Control(func(fd uintptr) {
if err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_RCVBUF, 1024*1024); err != nil {
fmt.Printf("Set socket receive buffer size failed: %vn", err)
}
fmt.Printf("Set socket receive buffer sizen")
})
return nil
}
func main() {
lc := net.ListenConfig{Control: control}
if _, err := lc.ListenPacket(context.Background(), "udp", "127.0.0.1:9999"); err != nil {
fmt.Printf("ListenPacket failed: %vn", err)
}
}