Ungültiger Argumentfehler mit HTTP-Server auf TCP-Socket
Beim Erstellen eines HTTP-Servers auf einem TCP-Socket in Go kann der Fehler auftreten Meldung „Akzeptiere TCP 127.0.0.1:80: Akzeptiere: Ungültiges Argument.“ Dieser Fehler kann auf ein Problem mit der Socket-Einrichtung hinweisen.
Socket-Erstellung mit VRF-Bindung
Der bereitgestellte Code erstellt einen TCP-Socket mit syscall.Socket und versucht, ihn zu binden an eine VRF-Schnittstelle. Die VRF-Bindung ist auskommentiert, sodass der Kern-Socket-Erstellungs- und Bindungsprozess intakt bleibt.
HTTP-Server-Setup
Ein net.FileListener wird mithilfe des Socket-Dateideskriptors erstellt. Der net.Listen-Vorgang ist abgeschlossen, aber das Starten des HTTP-Servers mit http.Serve löst den Fehler „Ungültiges Argument“ aus.
Socket-Defekt?
Sie könnten davon ausgehen, dass Der Socket ist defekt, es handelt sich jedoch eher um ein Problem mit der Socket-Konfiguration vor der Bindung. Um dieses Problem zu lösen, können wir eine net.ListenConfig verwenden, um die Socket-Optionen zu optimieren.
Mit net.ListenConfig
net.ListenConfig bietet eine Möglichkeit, benutzerdefinierte Sockets einzufügen Optionen vor dem Aufruf von syscall.Bind. Es garantiert, dass das Socket-Setup mit den Erwartungen des Netzpakets übereinstimmt.
Kontrollfunktion
Mit der Control-Methode von ListenConfig können Sie einen Abschluss angeben, der Zugriff auf das Raw ermöglicht Dateideskriptor, der beim Socket-Setup verwendet wird. Innerhalb dieses Abschlusses können Sie erforderliche Socket-Optionen anwenden, z. B. SO_BINDTODEVICE für die VRF-Bindung.
Beispiel
Hier ist ein Beispiel für die Verwendung von net.ListenConfig zur vorherigen Konfiguration des Sockets Bindung:
<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>
Durch die Verwendung von net.ListenConfig und seiner Control-Methode können Sie sicherstellen, dass Ihr Socket korrekt für Ihre spezifischen Anforderungen konfiguriert ist, bevor Sie ihn binden. Dadurch sollte der Fehler „Ungültiges Argument“ behoben werden und Sie können den HTTP-Server erfolgreich auf dem gewünschten TCP-Socket starten.
Das obige ist der detaillierte Inhalt vonWas verursacht den Fehler „Ungültiges Argument' bei Verwendung eines HTTP-Servers auf einem TCP-Socket?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!