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

UDP-Einwahl fehlgeschlagen: Adresse bereits verwendet

PHPz
PHPznach vorne
2024-02-09 21:27:11346Durchsuche

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

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

}

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

}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen