>  기사  >  백엔드 개발  >  Go에서 TCP 소켓에 HTTP 서버를 생성할 때 \"Accept: Invalid Argument\" 오류를 해결하는 방법은 무엇입니까?

Go에서 TCP 소켓에 HTTP 서버를 생성할 때 \"Accept: Invalid Argument\" 오류를 해결하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-24 16:30:17766검색

How to Resolve

Go에서 TCP 소켓의 HTTP 서버: "Accept: Invalid Argument" 오류 문제 해결

이 문제는 HTTP를 생성하려고 할 때 발생합니다. 특정 VRF 인터페이스 내 TCP 소켓의 서버. 소켓을 VRF에 올바르게 바인딩했음에도 불구하고 HTTP 서버를 시작하면 "accept tcp 127.0.0.1:80: accept:잘못된 인수"라는 오류가 발생합니다.

문제 이해

이 오류는 소켓 구성이 잘못되었거나 결함이 있을 수 있음을 나타냅니다. 다만, VRF 바인딩이 문제를 직접적으로 일으키는 것이 아니라, 컨텍스트를 위해 제공된 코드에 단순히 포함되어 있을 뿐이라는 점에 유의해야 합니다.

해결 방법

이를 해결하려면 문제가 발생하면 넷 패키지의 요구 사항에 따라 소켓이 올바르게 구성되었는지 확인해야 합니다. net.ListenConfig를 활용하면 syscall.Bind를 호출하기 전에 원하는 소켓 옵션을 지정할 수 있습니다.

코드 예제

다음 코드는 net.ListenConfig를 사용하여 다음을 수행하는 방법을 보여줍니다. 소켓 구성 문제 해결:

<code class="go">import (
    "context"
    "fmt"
    "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)
    }

    // ... Do something with the listener

    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>

설명

ListenConfig.Control 함수는 syscall.RawConn에 대한 액세스를 제공합니다. 이를 통해 기본 파일 설명자를 이전에 조작할 수 있습니다. 실제 소켓 바인딩이 수행됩니다. 제어 기능은 원하는 소켓 옵션을 지정하는 클로저로 호출됩니다(이 경우 특정 VRF 인터페이스에 바인딩).

ListenConfig를 활용하면 소켓 구성 프로세스가 넷의 기대치와 적절하게 동기화됩니다. HTTP 서버 작동을 위해 소켓이 올바르게 설정되었는지 확인합니다.

위 내용은 Go에서 TCP 소켓에 HTTP 서버를 생성할 때 \"Accept: Invalid Argument\" 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.