GoでTCPソケットからHTTPサーバーを作成する際の「無効な引数」エラーを解決する方法?

Susan Sarandon
リリース: 2024-10-25 04:47:02
オリジナル
570 人が閲覧しました

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

TCP ソケットからの HTTP サーバー (Go) 無効な引数の問題

で TCP ソケットを使用して HTTP サーバーを作成しようとしています。行く。ソケットを VRF インターフェイスに正常にバインドしましたが、HTTP サーバーを起動すると、「accept tcp 127.0.0.1:80: accept: valid argument.」というエラーが発生します。

解決策

このエラーは、ソケットに欠陥があるか、正しく作成されていない可能性があることを示しています。この問題を解決するには、ソケットをバインドする前に net.ListenConfig を使用してソケット オプションを指定します。これにより、net パッケージの期待どおりにソケットが正しく設定されることが保証されます。

ListenConfig.Control 関数を使用すると、Controlsyscall.RawConn クロージャの 🎜> メソッド。これにより、ソケットのセットアップで使用されるファイル記述子にアクセスできます。以下に例を示します。

<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>
ログイン後にコピー
この例では、

controlOnConnSetup 関数は、ソケットがバインドされる前に SO_BINDTODEVICE ソケット オプションを「vrfiface」に設定します。これにより、ソケットが指定された VRF インターフェイスに確実にバインドされます。

この変更を加えた後は、「無効な引数」エラーが発生することなく HTTP サーバーを正常に起動できるようになります。

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

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!