2016-04-03 98 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来解决。