doutuobao4004 2018-11-15 16:39
浏览 101
已采纳

序列化结构以通过UDP发送

I'm trying to figure out how to serialize a struct and send it via UDP to my server. I managed to actually send the struct but upon receiving I do not have any values in it... Except when I statically add a number.

In the following code I am sending a UDP packet to port 8080 with a sequential number which are just the numbers from 0-9. I'm adding + 1 to it to show my point. What I expect is that on the receiving end I should receive in the message part 1-10. But the only thing I receive is the number 1 which means that the variable should be set to 0.

To verify if I actually send 0 I print the length of the buffer I receive and it is the correct length of what it should be. So I must be doing something wrong with the decoding.

send function:

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

The listen function:

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
", p)
        }
    }
}

the struct I'm trying to send:

type Packet struct {
    Parts   []int 
    Message int64 
}
  • 写回答

1条回答 默认 最新

  • dqxz96998 2018-11-15 20:20
    关注

    Implemented this on my local machine. Yes PLEASE check your errors, but lucky for you, nothing was returning any. Here is what I did to fix the problem. In send_udp initialize the Buffer and Encoder INSIDE the for loop.

    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
    }
    

    Note that declaring the Buffer outside the for loop, you were actually sending every previous Packet each time you added a new one, hence the increasing n values when you printed the return from ReadFromUDP in your listen_udp function, but it was only decoding the first one every time. So if you were meaning to send them all at once, you would have to loop over the Decoder in your listen_udp function.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?