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

Go で TCP ソケットに HTTP サーバーをセットアップするときに発生する「無効な引数」エラーを解決する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 17:56:02295ブラウズ

How to Resolve

Go の TCP ソケット上の HTTP サーバー: 無効な引数エラーを解決する

Go で TCP ソケットを作成し、それを特定のデバイスにバインドする(VRF インターフェイス)、その上に HTTP サーバーをセットアップするのは面倒な作業になる可能性があります。この記事では、このプロセス中に発生する可能性のある一般的なエラー「accept tcp 127.0.0.1:80: accept: valid argument」に対処します。

問題

提供されたコードこのスニペットは、TCP ソケットを確立し、それを VRF インターフェイスにバインドし、そのインターフェイス上で HTTP サーバを起動しようとする試みを示しています。ただし、HTTP サーバーの起動に失敗し、前述のエラーが発生します。

解決策

このエラーの根本原因は、ソケットの構成が正しくないことです。これを修正するために、net.ListenConfig を使用して、syscall.Bind ステップの前に必要なソケット オプションを挿入します。この構成により、ソケットのセットアップが適切に処理され、ネット パッケージの期待と一致することが保証されます。

ListenConfig によるオプションの挿入

net.ListenConfig は、次のことを可能にする Control メソッドを提供します。カスタマイズされたソケット オプションを紹介します。これにより、クロージャを介してソケット構成で使用される生のファイル記述子へのアクセスが提供されます。

以下のコードは、ListenConfig.Control 関数を使用して SO_BINDTODEVICE オプションを挿入する方法を示しています。

<code class="go">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このコードを ListenConfig の Control フィールドに配置し、それを使用して TCP アドレスをリッスンすると、ソケットをバインドする前にカスタム ソケット オプションを挿入できます。

<code class="go">lc := net.ListenConfig{Control: controlOnConnSetup}
ln, err := lc.Listen(context.Background(), "tcp", "127.0.0.1:80")</code>

このアプローチにより、ソケットが正しく構成され、 「無効な引数」エラーを回避します。

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

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