首頁 > 後端開發 > Golang > UDP 撥號失敗:位址已被使用

UDP 撥號失敗:位址已被使用

PHPz
發布: 2024-02-09 21:27:11
轉載
401 人瀏覽過

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

php小編魚仔在使用UDP撥號功能時,可能會遇到"UDP撥號失敗:地址已使用"的錯誤提示。這個錯誤通常是由於網路連接埠被其他應用程式佔用所導致的。解決這個問題的方法有很多,可以透過查看當前運行的程序列表來找出佔用該端口的應用程序,並關閉它們;也可以嘗試修改撥號程序的端口設置,避免與已被佔用的端口衝突。總之,只要根據具體情況採取相應的措施,就能解決這個問題,從而順利完成UDP撥號。

問題內容

我正在編寫一個程式來取得 udp 伺服器。當我第一次獲取伺服器時它就可以工作。

但是當我第二次輸入程式時。這給了我這個錯誤

panic: Listen failed:dial udp :8829->:9781: bind: address already in use
登入後複製

程式碼:

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

}
登入後複製

我認為發生這種情況是因為我使用了客戶端兩次。

但是為什麼這會導致「地址已在使用中」

我不會重新建立客戶端。

我嘗試過的解決方案

解決方案之一可以將 client 設為 nil。

設定為 nil 將產生隨機連接埠。

但就我而言,我需要固定連接埠和固定網路位址。

所以這不是解決方案。

解決方法

只需在循環之前建立連接:

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

}
登入後複製

以上是UDP 撥號失敗:位址已被使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板