Maison >développement back-end >Golang >Échec de la connexion UDP : adresse déjà utilisée

Échec de la connexion UDP : adresse déjà utilisée

PHPz
PHPzavant
2024-02-09 21:27:11401parcourir

UDP 拨号失败:地址已被使用

L'éditeur php Yuzai peut rencontrer le message d'erreur "Échec de la numérotation UDP : l'adresse a été utilisée" lors de l'utilisation de la fonction de numérotation UDP. Cette erreur est généralement provoquée par le fait que le port réseau est occupé par une autre application. Il existe de nombreuses façons de résoudre ce problème. Vous pouvez connaître les applications occupant le port en affichant la liste des programmes en cours d'exécution et en les fermant, vous pouvez également essayer de modifier les paramètres de port du numéroteur pour éviter les conflits avec les ports déjà occupés. En bref, tant que des mesures appropriées sont prises en fonction de la situation spécifique, ce problème peut être résolu et la connexion UDP peut être réalisée avec succès.

Contenu de la question

J'écris un programme pour obtenir le serveur UDP. Cela fonctionne lorsque j'obtiens le serveur pour la première fois.

Mais quand j'entre dans le programme pour la deuxième fois. Cela m'a donné cette erreur

panic: Listen failed:dial udp :8829->:9781: bind: address already in use

Code :

package main

import (
    "fmt"
    "log"
    "net"
    "os"
)

func main() {
    log.SetFlags(log.Lshortfile)
    udpServer, err := net.ResolveUDPAddr("udp", ":9781")

    if err != nil {
        panic(fmt.Sprint("ResolveUDPAddr failed:", err.Error()))
        os.Exit(1)
    }

    client, err := net.ResolveUDPAddr("udp", ":8829")
    if err != nil {
            panic(err)
    }

    for {
        fmt.Printf(">> ")

        var input string
        fmt.Scanf("%s", &input)

        conn, err := net.DialUDP("udp", client, udpServer)
        if err != nil {
            panic(fmt.Sprint("Listen failed:", err.Error()))
            os.Exit(1)
        }

        _, err = conn.Write([]byte(input))
        if err != nil {
            panic(fmt.Sprint("Write data failed:", err.Error()))
            os.Exit(1)
        }

        received := make([]byte, 1024)
        _, err = conn.Read(received)
        if err != nil {
            panic(fmt.Sprint("Read data failed:", err.Error()))
            os.Exit(1)
        }

        fmt.Printf("Response: %s\n", string(received))
    }

}

Je pense que cela est arrivé parce que j'ai utilisé le client deux fois.

Mais pourquoi cela donne-t-il "Adresse déjà utilisée"

Je ne recréerai pas le client.

Solutions que j'ai essayées

Une des solutions peut être de définir le client sur zéro.

Réglé sur zéro pour générer un port aléatoire.

Mais dans mon cas, j'ai besoin d'un port fixe et d'une adresse réseau fixe.

Ce n’est donc pas la solution.

Solution de contournement

Créez simplement la connexion avant de boucler :

package main

import (
    "fmt"
    "log"
    "net"
    "os"
)

func main() {
    log.SetFlags(log.Lshortfile)
    udpServer, err := net.ResolveUDPAddr("udp", ":9781")

    if err != nil {
        panic(fmt.Sprint("ResolveUDPAddr failed:", err.Error()))
        os.Exit(1)
    }

    client, err := net.ResolveUDPAddr("udp", ":8829")
    if err != nil {
            panic(err)
    }

    conn, err := net.DialUDP("udp", client, udpServer)
    if err != nil {
        panic(fmt.Sprint("Listen failed:", err.Error()))
        os.Exit(1)
    }

    for {
        fmt.Printf(">> ")

        var input string
        fmt.Scanf("%s", &input)

        _, err = conn.Write([]byte(input))
        if err != nil {
            panic(fmt.Sprint("Write data failed:", err.Error()))
            os.Exit(1)
        }

        received := make([]byte, 1024)
        _, err = conn.Read(received)
        if err != nil {
            panic(fmt.Sprint("Read data failed:", err.Error()))
            os.Exit(1)
        }

        fmt.Printf("Response: %s\n", string(received))
    }

}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer