Home > Article > Backend Development > What Causes the \'Invalid Argument Error\' When Using an HTTP Server on a TCP Socket?
Invalid Argument Error with HTTP Server on TCP Socket
When creating an HTTP server on a TCP socket in Go, you may encounter the error message "accept tcp 127.0.0.1:80: accept: invalid argument." This error can indicate an issue with the socket setup.
Socket Creation with VRF Binding
The code provided creates a TCP socket using syscall.Socket and attempts to bind it to a VRF interface. The VRF binding is commented out, leaving the core socket creation and binding process intact.
HTTP Server Setup
A net.FileListener is created using the socket file descriptor. The net.Listen operation is completed, but starting the HTTP server using http.Serve throws the "invalid argument" error.
Socket Defect?
You might assume the socket is defective, but it's more likely an issue with the socket configuration before binding. To resolve this, we can employ a net.ListenConfig to fine-tune socket options.
Using net.ListenConfig
net.ListenConfig provides a way to inject custom socket options before calling syscall.Bind. It guarantees that the socket setup aligns with the expectations of the net package.
Control Function
ListenConfig's Control method allows you to specify a closure that provides access to the raw file descriptor used in socket setup. Within this closure, you can apply necessary socket options, such as SO_BINDTODEVICE for VRF binding.
Example
Here's an example of using net.ListenConfig to configure the socket before binding:
<code class="go">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>
By using net.ListenConfig and its Control method, you can ensure that your socket is correctly configured for your specific needs before binding it. This should resolve the "invalid argument" error and allow you to successfully start the HTTP server on the desired TCP socket.
The above is the detailed content of What Causes the \'Invalid Argument Error\' When Using an HTTP Server on a TCP Socket?. For more information, please follow other related articles on the PHP Chinese website!