Сериализация структуры для отправки через UDP - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь выяснить, как сериализовать структуру и отправить ее через UDP на мой сервер.Мне удалось на самом деле отправить структуру, но после получения у меня нет никаких значений в ней ... За исключением случаев, когда я статически добавляю число.

В следующем коде я отправляю пакет UDP на порт 8080 с порядковым номером, представляющим собой цифры от 0 до 9.Я добавляю +1 к нему, чтобы показать свою точку зрения.Я ожидаю, что на стороне получателя я должен получить сообщение в части 1-10.Но единственное, что я получаю, это число 1, которое означает, что переменная должна быть установлена ​​на 0.

Чтобы проверить, действительно ли я отправляю 0, я печатаю длину полученного буфера, и это правильная длиначто это должно быть.Поэтому я, должно быть, что-то не так делаю с декодированием.

функция отправки:

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

Функция прослушивания:

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

структура, которую я пытаюсь отправить:

type Packet struct {
    Parts   []int 
    Message int64 
}

1 Ответ

0 голосов
/ 15 ноября 2018

Реализовано это на моей локальной машине. Да, пожалуйста, проверьте свои ошибки, но, к счастью для вас, ничего не возвращалось. Вот что я сделал, чтобы исправить проблему. В send_udp инициализируйте Buffer и Encoder ВНУТРИ цикла for.

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 вне цикла for, вы фактически отправляли каждый предыдущий Packet каждый раз, когда добавляли новый, следовательно, увеличивались значения n, когда вы печатали возврат из ReadFromUDP в вашем listen_udp, но каждый раз он декодировал только первый. Так что, если вы намереваетесь отправить их всех сразу, вам придется перебрать Decoder в вашей функции listen_udp.

...