Maison  >  Article  >  développement back-end  >  Quelles sont les causes de l'« Erreur d'argument non valide » lors de l'utilisation d'un serveur HTTP sur un socket TCP ?

Quelles sont les causes de l'« Erreur d'argument non valide » lors de l'utilisation d'un serveur HTTP sur un socket TCP ?

DDD
DDDoriginal
2024-10-24 18:53:02231parcourir

What Causes the

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn