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

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

Linda Hamilton
リリース: 2024-10-24 18:09:02
オリジナル
1004 人が閲覧しました

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 リクエストを処理します。

コード サンプル:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート