我有一个客户端服务器应用程序,它将数据从 C# 客户端发送到 C++ 服务器。当服务器收到这个数据请求时,10 次中有 9 次工作正常,但总有 1 次会在服务器端接收到的数据末尾附加垃圾数据。
例如,它接收的不是数字 1,而是 1C 或 1@?????
以下是客户端和服务器代码片段,我们将不胜感激。
C# 客户端
int flagSide = 1;
msg = name;
msg += "+";
msg += "qty";
msg += "+";
msg += flagSide.ToString();
ZeroMQ.ZmqContext context = ZeroMQ.ZmqContext.Create();
ZeroMQ.ZmqSocket socket = context.CreateSocket(SocketType.REQ);
socket.Connect("tcp://111.111.0.111:5556");
socket.Send(Encoding.ASCII.GetBytes(msg.ToCharArray()));
Thread.Sleep(1);
string reply = socket.Receive(Encoding.ASCII);
Console.WriteLine("Received reply = " + reply + "\n");
C++ 服务器
std::tr1::unordered_map <std::string, std::string> aMap;
zmq::context_t context( 1 );
zmq::socket_t responder( context, ZMQ_REP );
responder.bind ("tcp://*:5556");
while ( 1 )
{
zmq::message_t recvMsg;
responder.recv( &recvMsg );
t = static_cast<char*>( recvMsg.data() );
std::string s(t);
std::vector<std::string> strs;
boost::split(strs, s, boost::is_any_of("+"));
aMap["name"] = strs[0];
aMap["qty"] = strs[1];
aMap["flag"] = strs[2];
..........
在服务器中输出拆分字符串显示有时标志或 strs[2] 接收到垃圾数据。
如果你看到我没有看到的东西,请帮助我。
谢谢
最佳答案
在 C# 中,转换为字节的字符串不以 null 终止,而 c++ 字符串需要一个以 null 终止的指针。
所以我推测这里发生的是缓冲区下溢。您正在读取不属于该字符串的内存。
关于c# - ZMQ recv 随机拾取垃圾数据 有谁知道为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049703/