Home >Backend Development >Golang >How to Resolve \'invalid argument\' Error When Creating HTTP Server from TCP Socket in Go?
HTTP Server from TCP Socket (in Go) Problem with invalid argument
You are trying to create an HTTP server using a TCP socket in Go. You have successfully bound the socket to a VRF interface, but when you start the HTTP server, you encounter an error: "accept tcp 127.0.0.1:80: accept: invalid argument."
Solution
The error indicates that the socket may be defective or created incorrectly. To resolve this issue, you can use a net.ListenConfig to specify socket options before binding the socket. This ensures that the socket is set up correctly, as expected by the net package.
The ListenConfig.Control function allows you to call the Control method on a syscall.RawConn closure, which gives you access to the file descriptor used in socket setup. Here's an example:
<code class="go">package main import ( "context" "log" "net" "syscall" ) func main() { lc := net.ListenConfig{Control: controlOnConnSetup} ln, err := lc.Listen(context.Background(), "tcp", "127.0.0.1:80") if err != nil { log.Fatal(err) } ln.Close() } func controlOnConnSetup(network string, address string, c syscall.RawConn) error { var operr error fn := func(fd uintptr) { operr = syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, syscall.SO_BINDTODEVICE, "vrfiface") } if err := c.Control(fn); err != nil { return err } if operr != nil { return operr } return nil }</code>
In this example, the controlOnConnSetup function sets the SO_BINDTODEVICE socket option to "vrfiface" before the socket is bound. This ensures that the socket is bound to the specified VRF interface.
After making this change, you should be able to successfully start your HTTP server without encountering the "invalid argument" error.
The above is the detailed content of How to Resolve \'invalid argument\' Error When Creating HTTP Server from TCP Socket in Go?. For more information, please follow other related articles on the PHP Chinese website!