2016-04-03 3 views
0

私はPythonプログラムとgolangプログラムの両方でソケットからデータを取得しています。私は両方から受け取ったバイトを出力します。golang googleプロトコルバッファーのバグ

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

投稿にgoコードを追加しました。 – Ivan

+0

これがすべてであるかどうかは分かりませんが、 'b [:n]'だけを非マーシャルにする必要があります。私はあなたが知っていると思うが、 'b'は最大の可能なデータグラムを保持するのに十分な長さです。 'b [:n]'は実データを持つ部分です。 – twotwotwo

答えて

2

あなたのバッファbが可能な最大データグラムパケットのための大きさそのすべてがあなたのメッセージではなく、最初のnバイトだけです。 illegal tag 0wire type 0に関するメッセージは、それ以外の方法で初期化していないバッファ領域の0バイトを解析しようとした結果になります。 b[:n]Unmarshalを修正して修正してください。

関連する問題