
TCP ソケットからの HTTP サーバー (Go 内)
問題:
HTTP の作成カスタム TCP ソケットを使用して特定の VRF インターフェイス上のサーバーを実行すると、エラー「accept tcp 127.0.0.1:80: accept: valid argument.」が発生します。
解決策:
net.ListenConfig を使用したソケット オプションの挿入:
この問題を解決するには、syscall.Bind を呼び出す前に net.ListenConfig を使用して必要なソケット オプションを挿入します。これにより、ソケットのセットアップが net パッケージの仕様に従って確実に実行されます。
手順:
- 制御関数を使用して net.ListenConfig を定義します。生のファイル記述子を操作します。
- Control 関数を使用して syscall.SetsockoptString を呼び出し、VRF インターフェイス バインディングを設定します。
- 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 サイトの他の関連記事を参照してください。