Serveur HTTP sur socket TCP en Go : résolution d'une erreur d'argument non valide
En Go, création d'un socket TCP, en le liant à un périphérique spécifique (interface VRF), et la configuration d'un serveur HTTP dessus peut être une tâche fastidieuse. Cet article traite de l'erreur courante « accepter tcp 127.0.0.1:80 : accepter : argument invalide » qui peut survenir au cours de ce processus.
Le problème
Le code fourni L'extrait montre une tentative d'établissement d'un socket TCP, de la lier à une interface VRF et de démarrer un serveur HTTP sur cette interface. Cependant, le serveur HTTP ne parvient pas à démarrer, ce qui entraîne l'erreur susmentionnée.
La solution
La configuration incorrecte du socket est à l'origine de cette erreur. Pour y remédier, nous utilisons un net.ListenConfig pour injecter les options de socket souhaitées avant l'étape syscall.Bind. Cette configuration garantit que la configuration du socket est gérée de manière appropriée et correspond aux attentes du package net.
Options d'injection avec ListenConfig
net.ListenConfig propose une méthode de contrôle qui permet nous pour introduire des options de socket personnalisées. Il permet d'accéder au descripteur de fichier brut utilisé dans la configuration du socket via une fermeture.
Le code ci-dessous montre comment injecter l'option SO_BINDTODEVICE à l'aide de la fonction ListenConfig.Control :
<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>
Par en plaçant ce code dans le champ Control de ListenConfig et en l'utilisant pour écouter sur une adresse TCP, nous pouvons injecter notre option de socket personnalisée avant de lier le socket :
<code class="go">lc := net.ListenConfig{Control: controlOnConnSetup} ln, err := lc.Listen(context.Background(), "tcp", "127.0.0.1:80")</code>
Cette approche garantit que le socket est configuré correctement et évite l'erreur "argument invalide".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!