我試圖在C#和C++之間進行通信與不同數量的成功。無法返回使用Google協議緩衝區從C#到C + +和
我能夠使用回覆/請求在兩者之間發送消息,但我收到的雙打不正確。
爲了調試的目的和理解,我目前運行以下:
Clrzmq 3.0 RC1,谷歌ProtocolBuffer 2.5的Protobuf-CSHARP端口-2.4,ZeroMQ-3.2.3
.Proto
package InternalComm;
message Point
{
optional double x = 1;
optional double y = 2;
optional string label = 3;
}
server.cpp(相關部分)
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv (&request);
zmq::message_t reply (request.size());
memcpy ((void*)reply.data(), request.data(), request.size());
socket.send(reply);
}
客戶.cs(相關部分)
public static Point ProtobufPoint(Point point)
{
Point rtn = new Point(0,0);
using (var context = ZmqContext.Create())
{
using (ZmqSocket requester = context.CreateSocket(SocketType.REQ))
{
requester.Connect("tcp://localhost:5555");
var p = InternalComm.Point.CreateBuilder().SetX(point.X).SetY(point.Y).Build().ToByteArray();
requester.Send(p);
string reply = requester.Receive(Encoding.ASCII);
Console.WriteLine("Input: {0}", point);
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(reply);
var message = InternalComm.Point.ParseFrom(bytes);
rtn.X = message.X;
rtn.Y = message.Y;
Console.WriteLine("Output: {0}", rtn);
}
}
return rtn;
}
在C#端,Point是一個非常簡單的結構。只需x和y屬性。
下面是我從單元測試中得到的運行上述代碼的結果。
輸入(1.31616874365468,4.55516872325469)
輸出(0.000473917985115791,4.55516872323627)輸入(274.120398471829,274.128936418736)
輸出(274.077917334613,274.128936049925)輸入(150.123798461987, 2.345E-12)
輸出(145.976 459594794,1.11014954927532E-13)輸入(150,0)
輸出(145.96875,0)
我想這個問題是我的protobuf的代碼不正確(懷疑這是一個錯誤在Skeet的一側)。我也在假設server.cpp對消息沒有任何作用,但按原樣返回。
想法?
只是爲了確認:System.Text.Encoding.ASCII.GetBytes(reply);這絕對是一個巨大的問題。 Protobuf數據*不是ascii * –