Я пытаюсь создать TCP-сокет в Go, связать его с VRF-интерфейсом и установить sh HTTP-сервер в этом указанном c интерфейсе. Привязка VRF работает правильно, но при запуске HTTP-сервера возвращается сообщение об ошибке "accept tcp 127.0.0.1:80: accept: неверный аргумент" . Правильно ли я предполагаю, что сокет каким-то образом неисправен, и я создаю его неправильно?
Ниже приведена упрощенная версия, воспроизводящая проблему. Часть VRF закомментирована, так как она не влияет на реальную проблему, но я оставляю ее здесь, так как стараюсь избегать, чтобы люди говорили мне просто использовать net .Listen вместо сокетов. VRF необходимо связать с первым, прежде чем его можно будет использовать, поэтому net .Listen, к сожалению, не вариант.
package main
import (
"fmt"
"net"
"net/http"
"os"
"syscall"
)
func main() {
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
if err != nil {
fmt.Printf("Error creating socket: %v", err)
os.Exit(1)
}
// if err = syscall.SetsockoptString(fd, syscall.SOL_SOCKET, syscall.SO_BINDTODEVICE, "vrfiface"); err != nil {
// fmt.Printf("Error binding to vrf: %v", err)
// os.Exit(1)
// }
sockAddr := &syscall.SockaddrInet4{
Port: 80,
Addr: [4]byte{127, 0, 0, 1},
}
if err = syscall.Bind(fd, sockAddr); err != nil {
fmt.Printf("Error binding to IP and port: %v", err)
os.Exit(1)
}
file := os.NewFile(uintptr(fd), "socketfile")
if file == nil {
fmt.Println("Error creating file")
os.Exit(1)
}
listener, err := net.FileListener(file)
if err != nil {
fmt.Printf("Error creating a listener: %v", err)
os.Exit(1)
}
http.HandleFunc("/", TestServer)
if err = http.Serve(listener, nil); err != nil {
fmt.Printf("Error serving HTTP requests: %v", err)
}
}
func TestServer(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Test, %s!", r.URL.Path[1:])
}
Буду признателен за любые указания по решению этой проблемы. Спасибо!