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

Comment résoudre l'erreur « Accepter : argument invalide » lors de la création d'un serveur HTTP sur un socket TCP dans Go ?

DDD
DDDoriginal
2024-10-24 16:30:17766parcourir

How to Resolve

Serveur HTTP à partir d'un socket TCP dans Go : Dépannage d'une erreur « Accepter : argument invalide »

Ce problème survient lors de la tentative de création d'un HTTP serveur sur un socket TCP au sein d’une interface VRF spécifique. Bien que le socket soit correctement lié au VRF, le démarrage du serveur HTTP entraîne une erreur indiquant « accepter tcp 127.0.0.1:80 : accepter : argument invalide ».

Comprendre le problème

Cette erreur suggère que la configuration du socket peut être incorrecte ou défectueuse. Cependant, il est essentiel de noter que la liaison VRF n'est pas directement à l'origine du problème mais est simplement incluse dans le code fourni à titre de contexte.

Résolution

Pour résoudre ce problème problème, il est nécessaire de s'assurer que le socket est configuré correctement selon les exigences du package net. Un net.ListenConfig peut être utilisé pour spécifier les options de socket souhaitées avant d'appeler syscall.Bind.

Exemple de code

Le code suivant démontre l'utilisation de net.ListenConfig pour résoudre le problème de configuration du socket :

<code class="go">import (
    "context"
    "fmt"
    "log"
    "net"
    syscall
)

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)
    }

    // ... Do something with the listener

    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>

Explication

La fonction ListenConfig.Control donne accès au syscall.RawConn, qui permet la manipulation du descripteur de fichier sous-jacent avant la liaison de socket réelle est effectuée. La fonction Control est invoquée avec une fermeture qui spécifie l'option de socket souhaitée, dans ce cas, une liaison à une interface VRF spécifique.

En utilisant ListenConfig, le processus de configuration du socket est correctement synchronisé avec les attentes du net. package, en s'assurant que le socket est correctement configuré pour le fonctionnement du serveur HTTP.

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