Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Dail UDP gagal: alamat sudah digunakan

Dail UDP gagal: alamat sudah digunakan

PHPz
PHPzke hadapan
2024-02-09 21:27:11347semak imbas

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

editor php Yuzai mungkin menghadapi mesej ralat "Dail UDP gagal: Alamat telah digunakan" apabila menggunakan fungsi pendailan UDP. Ralat ini biasanya disebabkan oleh port rangkaian yang diduduki oleh aplikasi lain. Terdapat banyak cara untuk menyelesaikan masalah ini Anda boleh mengetahui aplikasi yang menduduki port dengan melihat senarai program yang sedang dijalankan dan menutupnya Anda juga boleh cuba mengubah suai tetapan port pendail untuk mengelakkan konflik dengan port yang telah diduduki. Pendek kata, selagi langkah-langkah yang sesuai diambil mengikut situasi tertentu, masalah ini boleh diselesaikan dan dial-up UDP boleh diselesaikan dengan jayanya.

Kandungan soalan

Saya sedang menulis program untuk mendapatkan pelayan udp. Ia berfungsi apabila saya mula-mula mendapat pelayan.

Tapi bila dah masuk program kali kedua. Ini memberi saya ralat ini

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

Kod:

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

}

Saya rasa ini berlaku kerana saya menggunakan pelanggan dua kali.

Tetapi kenapa ini mengakibatkan "Alamat sudah digunakan"

Saya tidak akan mencipta semula pelanggan.

Penyelesaian yang saya cuba

Salah satu penyelesaiannya ialah menetapkan pelanggan kepada sifar.

Tetapkan kepada sifar untuk menjana port rawak.

Tetapi dalam kes saya, saya memerlukan port tetap dan alamat rangkaian tetap.

Jadi ini bukan penyelesaian.

Penyelesaian

Hanya buat sambungan sebelum menggelung:

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

}

Atas ialah kandungan terperinci Dail UDP gagal: alamat sudah digunakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam