c# - ZMQ recv 随机拾取垃圾数据 有谁知道为什么?

标签 c# c++ network-programming zeromq

我有一个客户端服务器应用程序,它将数据从 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/

相关文章:

c# - NumericUpDown 背景色未按预期工作

c# - 如何动态加载程序集到当前应用程序域到c#项目?

C# "Integral constant is too large"- Int32 类型的整数变量太大

c++ - 强制 boost 变体存储指针

c++ - 访问违规写入位置,在我的循环中

C++ b树合并

java - 通过 JavaFX 连接到服务器的用户同步 YouTube 视频播放

linux-kernel - 有关内核空间中网络接口(interface)的信息

c# - 异步加载 BitmapSource 图像时内存泄漏

java - java中长消息的RSA加解密