Home  >  Article  >  Backend Development  >  How to Resolve \'invalid argument\' Error When Creating HTTP Server from TCP Socket in Go?

How to Resolve \'invalid argument\' Error When Creating HTTP Server from TCP Socket in Go?

Susan Sarandon
Susan SarandonOriginal
2024-10-25 04:47:02570browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn