Heim > Backend-Entwicklung > Golang > UDP-Einwahl fehlgeschlagen: Adresse bereits verwendet

UDP-Einwahl fehlgeschlagen: Adresse bereits verwendet

PHPz
Freigeben: 2024-02-09 21:27:11
nach vorne
401 Leute haben es durchsucht

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

Wenn der PHP-Editor Yuzai die UDP-Wählfunktion verwendet, kann die Fehlermeldung „UDP-Wählen fehlgeschlagen: Die Adresse wurde verwendet“ angezeigt werden. Dieser Fehler wird normalerweise dadurch verursacht, dass der Netzwerkport von einer anderen Anwendung belegt ist. Es gibt viele Möglichkeiten, dieses Problem zu lösen. Sie können die Anwendungen herausfinden, die den Port belegen, indem Sie die Liste der aktuell ausgeführten Programme anzeigen und sie schließen. Sie können auch versuchen, die Porteinstellungen des Dialers zu ändern, um Konflikte mit bereits belegten Ports zu vermeiden. Kurz gesagt: Solange geeignete Maßnahmen entsprechend der jeweiligen Situation ergriffen werden, kann dieses Problem gelöst und die UDP-Einwahl erfolgreich abgeschlossen werden.

Frageninhalt

Ich schreibe ein Programm, um einen UDP-Server zu erhalten. Es funktioniert, wenn ich den Server zum ersten Mal bekomme.

Aber wenn ich das Programm zum zweiten Mal betrete. Dies gab mir diesen Fehler

panic: Listen failed:dial udp :8829->:9781: bind: address already in use
Nach dem Login kopieren

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

}
Nach dem Login kopieren

Ich glaube, das ist passiert, weil ich den Client zweimal verwendet habe.

Aber warum führt dies zu „Adresse bereits verwendet“

Ich werde den Client nicht neu erstellen.

Lösungen, die ich ausprobiert habe

Eine der Lösungen könnte darin bestehen, den Client auf Null zu setzen.

Auf Null setzen, um einen zufälligen Port zu generieren.

Aber in meinem Fall benötige ich einen festen Port und eine feste Netzwerkadresse.

Das ist also nicht die Lösung.

Workaround

Stellen Sie einfach die Verbindung her, bevor Sie eine Schleife erstellen:

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

}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonUDP-Einwahl fehlgeschlagen: Adresse bereits verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage