Erreur d'argument invalide avec le serveur HTTP sur le socket TCP
Lors de la création d'un serveur HTTP sur un socket TCP dans Go, vous pouvez rencontrer l'erreur message "accepter TCP 127.0.0.1:80 : accepter : argument non valide." Cette erreur peut indiquer un problème avec la configuration du socket.
Création de socket avec liaison VRF
Le code fourni crée un socket TCP à l'aide de syscall.Socket et tente de le lier à une interface VRF. La liaison VRF est commentée, laissant intact le processus de création et de liaison du socket principal.
Configuration du serveur HTTP
Un net.FileListener est créé à l'aide du descripteur de fichier de socket. L'opération net.Listen est terminée, mais le démarrage du serveur HTTP à l'aide de http.Serve génère l'erreur « argument invalide ».
Défaut de socket ?
Vous pourriez supposer que le le socket est défectueux, mais il s'agit plus probablement d'un problème avec la configuration du socket avant la liaison. Pour résoudre ce problème, nous pouvons utiliser un net.ListenConfig pour affiner les options de socket.
L'utilisation de net.ListenConfig
net.ListenConfig fournit un moyen d'injecter un socket personnalisé options avant d’appeler syscall.Bind. Il garantit que la configuration du socket correspond aux attentes du package net.
Fonction de contrôle
La méthode Control de ListenConfig vous permet de spécifier une fermeture qui donne accès au brut descripteur de fichier utilisé dans la configuration du socket. Dans cette fermeture, vous pouvez appliquer les options de socket nécessaires, telles que SO_BINDTODEVICE pour la liaison VRF.
Exemple
Voici un exemple d'utilisation de net.ListenConfig pour configurer le socket avant liaison :
<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>
En utilisant net.ListenConfig et sa méthode Control, vous pouvez vous assurer que votre socket est correctement configuré pour vos besoins spécifiques avant de la lier. Cela devrait résoudre l'erreur "argument invalide" et vous permettre de démarrer avec succès le serveur HTTP sur le socket TCP souhaité.
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!