ホームページ  >  記事  >  バックエンド開発  >  Go でカスタム TCP ソケットに HTTP サーバーを作成するときに発生する「無効な引数」エラーを解決する方法

Go でカスタム TCP ソケットに HTTP サーバーを作成するときに発生する「無効な引数」エラーを解決する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-24 18:09:02922ブラウズ

How to Resolve

TCP ソケットからの HTTP サーバー (Go 内)

問題:

HTTP の作成カスタム TCP ソケットを使用して特定の VRF インターフェイス上のサーバーを実行すると、エラー「accept tcp 127.0.0.1:80: accept: valid argument.」が発生します。

解決策:

net.ListenConfig を使用したソケット オプションの挿入:

この問題を解決するには、syscall.Bind を呼び出す前に net.ListenConfig を使用して必要なソケット オプションを挿入します。これにより、ソケットのセットアップが net パッケージの仕様に従って確実に実行されます。

手順:

  1. 制御関数を使用して net.ListenConfig を定義します。生のファイル記述子を操作します。
  2. Control 関数を使用して syscall.SetsockoptString を呼び出し、VRF インターフェイス バインディングを設定します。
  3. ListenConfig を使用してリスナーを作成し、HTTP リクエストを処理します。

コード サンプル:

<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>

このアプローチにより、ソケットを IP アドレスとポートにバインドする前にカスタム ソケット オプションを追加でき、ソケットの作成時に発生する問題が解決されます。特定の VRF インターフェイス上の HTTP サーバー。

以上がGo でカスタム TCP ソケットに HTTP サーバーを作成するときに発生する「無効な引数」エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。