Настройка размера буфера приема операционной системы для ipv4.PacketConn

#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)
    }
}
  

Игровая площадка Golang.