首頁  >  文章  >  後端開發  >  在 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:invalid argument」。

問題

提供的程式碼片段顯示了建立 TCP 套接字、將其綁定到 VRF 介面並在該介面上啟動 HTTP 伺服器的嘗試。然而,HTTP 伺服器無法啟動,導致上述錯誤。

解決方案

socket 配置不正確是導致此錯誤的根本原因。為了修正這個問題,我們在 syscall.Bind 步驟之前使用 net.ListenConfig 注入所需的套接字選項。此配置可確保套接字設定得到正確處理並符合 net 套件的期望。

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

透過將此程式碼放在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn