2016-04-03 132 views
0

我有一個python程序和一個golang程序,都從套接字獲取數據。我打印它們從兩個接收的字節。golang谷歌協議緩衝區中的錯誤

python 

Data = 0a300a084a6f686e20446f6510071a126a6f686e2e646f6540676d61696c2e636f6d220e0a0c3131312d3131312d31313130 

golang 

2016/04/02 23:21:08 50 bytes read from 192.168.0.1:65120 
2016/04/02 23:21:08 00000000 0a 30 0a 08 4a 6f 68 6e 20 44 6f 65 10 08 1a 12 |.0..John Doe....| 
00000010 6a 6f 68 6e 2e 64 6f 65 40 67 6d 61 69 6c 2e 63 |[email protected]| 
00000020 6f 6d 22 0e 0a 0c 31 31 31 2d 31 31 31 2d 31 31 |om"...111-111-11| 
00000030 31 30            |10| 

.proto文件在兩者中都是相同的。

syntax = "proto3"; 
package MC_Feed; 

message Person { 
    enum PhoneType { 
    MOBILE = 0; 
    HOME = 1; 
    WORK = 2; 
    } 

    string name = 1; 
    int32 id = 2; // Unique ID number for this person. 
    string email = 3; 

    message PhoneNumber { 
    string number = 1; 
    PhoneType type = 2; 
    } 

    repeated PhoneNumber phones = 4; 
} 

// Our address book file is just one of these. 
message AddressBook { 
    repeated Person people = 1; 
} 

關於python(和C#的問題)它工作正常。在golang方面,我得到這個錯誤:

2016/04/02 23:21:08 proto: MC_Feed.AddressBook: illegal tag 0 (wire type 0) 

轉到代碼是我從網上得到了和修改了一點:

package main 

import (
    "github.com/golang/protobuf/proto" 
    "encoding/hex" 
    "./Simple" 
    "log" 
    "net" 
) 

const (
    srvAddr   = "239.0.0.222:345" 
    maxDatagramSize = 8192 
) 

func main() { 
    serveMulticastUDP(srvAddr, msgHandler) 
} 


func msgHandler(src *net.UDPAddr, n int, b []byte) { 
    log.Println(n, "bytes read from", src) 
    log.Println(hex.Dump(b[:n])) 
    newTest := &MC_Feed.AddressBook{} 
    err := proto.Unmarshal(b, newTest) 
    log.Println(err) 
} 

func serveMulticastUDP(a string, h func(*net.UDPAddr, int, []byte)) { 
    addr, err := net.ResolveUDPAddr("udp", a) 
    if err != nil { 
     log.Fatal(err) 
    } 
    l, err := net.ListenMulticastUDP("udp", nil, addr) 
    l.SetReadBuffer(maxDatagramSize) 
    for { 
     b := make([]byte, maxDatagramSize) 
     n, src, err := l.ReadFromUDP(b) 
     if err != nil { 
      log.Fatal("ReadFromUDP failed:", err) 
     } 
     h(src, n, b) 
    } 
} 
+0

儘可能多的Go代碼可以給我們提供幫助。除非有人熟悉導致錯誤信息的原因,否則很難從中猜出。 – twotwotwo

+0

我在帖子中添加了轉到代碼。 – Ivan

+0

不知道這是否全部,但你只需'解組'''只有'b [:n]',而不是全部'b'。我想你知道,但'b'足夠長,可以容納最大的數據報; 'b [:n]'是具有真實數據的部分。 – twotwotwo

回答

2

你的緩衝b的大小爲最大可能的數據報文包但並不是所有這些都是你的信息,只有第一個字節是n。有關illegal tag 0wire type 0的消息是因爲嘗試在尚未初始化的緩衝區空間中解析0字節所致。通過b[:n]Unmarshal來解決。