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

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

Susan Sarandon
Susan Sarandonoriginal
2024-10-25 04:47:02570parcourir

How to Resolve 'invalid argument' Error When Creating HTTP Server from TCP Socket in Go?

Serveur HTTP à partir d'un socket TCP (en Go) Problème avec un argument non valide

Vous essayez de créer un serveur HTTP à l'aide d'un socket TCP en Aller. Vous avez réussi à lier le socket à une interface VRF, mais lorsque vous démarrez le serveur HTTP, vous rencontrez une erreur : "accepter tcp 127.0.0.1:80 : accepter : argument non valide."

Solution

L'erreur indique que le socket peut être défectueux ou créé de manière incorrecte. Pour résoudre ce problème, vous pouvez utiliser un net.ListenConfig pour spécifier les options du socket avant de lier le socket. Cela garantit que le socket est configuré correctement, comme prévu par le package net.

La fonction ListenConfig.Control vous permet d'appeler le Control sur une fermeture syscall.RawConn, qui vous donne accès au descripteur de fichier utilisé dans la configuration du socket. Voici un exemple :

<code class="go">package main

import (
    "context"
    "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)
    }
    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>

Dans cet exemple, la fonction controlOnConnSetup définit l'option de socket SO_BINDTODEVICE sur "vrfiface" avant que la socket ne soit liée. Cela garantit que le socket est lié à l'interface VRF spécifiée.

Après avoir effectué cette modification, vous devriez pouvoir démarrer avec succès votre serveur HTTP sans rencontrer 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