第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

序列化結(jié)構(gòu)以通過 UDP 發(fā)送它

序列化結(jié)構(gòu)以通過 UDP 發(fā)送它

Go
炎炎設(shè)計(jì) 2023-05-08 16:26:07
我想弄清楚如何序列化一個(gè)結(jié)構(gòu)并通過 UDP 將它發(fā)送到我的服務(wù)器。我設(shè)法實(shí)際發(fā)送了該結(jié)構(gòu),但在收到時(shí)我沒有任何值......除非我靜態(tài)添加一個(gè)數(shù)字。在下面的代碼中,我將一個(gè) UDP 數(shù)據(jù)包發(fā)送到端口 8080,其中的序號(hào)是 0-9 中的數(shù)字。我給它加上 + 1 來表明我的觀點(diǎn)。我期望的是在接收端我應(yīng)該在消息第 1-10 部分中收到。但我唯一收到的是數(shù)字 1,這意味著該變量應(yīng)設(shè)置為 0。為了驗(yàn)證我是否真的發(fā)送了 0,我打印了我收到的緩沖區(qū)的長(zhǎng)度,它是它應(yīng)該是的正確長(zhǎng)度。所以我一定是在解碼方面做錯(cuò)了什么。發(fā)送功能:func send_udp() {    dst, _ := net.ResolveUDPAddr("udp", "localhost:8080")    conn, _ := net.ListenPacket("udp", ":0")    defer conn.Close()    var buf bytes.Buffer    encoder := gob.NewEncoder(&buf)    for n := 0; n < 10; n++ {        var msg int64 = int64(n) + 1        packet := &Packet{[]int{5}, msg}        encoder.Encode(packet)        conn.WriteTo(buf.Bytes(), dst)    }}監(jiān)聽功能:func listen_udp() {    dst, _ := net.ResolveUDPAddr("udp", "localhost:8080")    conn, _ := net.ListenUDP("udp", dst)    defer conn.Close()    for {        buf := make([]byte, 4096)        n, _, _ := conn.ReadFromUDP(buf[:])        fmt.Println(n)        dec := gob.NewDecoder(bytes.NewReader(buf[:n]))        p := Packet{}        dec.Decode(&p)        if len(p.Parts) != 0 {            fmt.Printf("Received: %+v\n", p)        }    }}我要發(fā)送的結(jié)構(gòu):type Packet struct {    Parts   []int     Message int64 }
查看完整描述

1 回答

?
湖上湖

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊

在我的本地機(jī)器上實(shí)現(xiàn)了這個(gè)。是的,請(qǐng)檢查您的錯(cuò)誤,但幸運(yùn)的是,沒有返回任何內(nèi)容。這是我為解決問題所做的工作。在send_udp初始化Buffer和EncoderINSIDE for 循環(huán)中。


func send_udp() error {

    dst, err := net.ResolveUDPAddr("udp", "localhost:8080")

    if err != nil {

        return err

    }

    conn, err := net.ListenPacket("udp", ":0")

    if err != nil {

        return err

    }

    defer conn.Close()


    for n := 0; n < 10; n++ {

        // inside for loop

        var buf bytes.Buffer

        encoder := gob.NewEncoder(&buf)


        var msg int64 = int64(n) + 1

        packet := &Packet{[]int{5}, msg}

        err = encoder.Encode(packet)

        if err != nil {

            return err

        }

        _, err = conn.WriteTo(buf.Bytes(), dst)

        if err != nil {

            return err

        }

    }

    return nil

}

Buffer請(qǐng)注意,在for 循環(huán)外部聲明時(shí),實(shí)際上Packet每次添加新循環(huán)時(shí)都會(huì)發(fā)送前一個(gè)循環(huán),因此當(dāng)您在函數(shù)中n打印返回值時(shí)會(huì)增加值,但每次都只解碼第一個(gè)循環(huán)。所以如果你打算一次發(fā)送它們,你將不得不在你的函數(shù)中循環(huán)。ReadFromUDPlisten_udpDecoderlisten_udp


查看完整回答
反對(duì) 回復(fù) 2023-05-08
  • 1 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)