Maison  >  Article  >  développement back-end  >  Comment résoudre l'erreur « Argument invalide » lors de la configuration d'un serveur HTTP sur un socket TCP dans Go ?

Comment résoudre l'erreur « Argument invalide » lors de la configuration d'un serveur HTTP sur un socket TCP dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 17:56:02295parcourir

How to Resolve

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!

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