我有一個客戶端服務器應用程序,它將數據從C#客戶端發送到C++服務器。當服務器接收到這個數據請求時,10次中有9次可以正常工作,但總是會有1次在服務器端收到數據末尾附加垃圾數據。ZMQ recv隨機挑選垃圾數據是否有人知道爲什麼?
例如,代替接收數字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];
..........
outputing在服務器中的分割字符串顯示,有時該標誌或STR的[2]接收垃圾數據。
請幫助我,如果你看到我沒有看到的東西。
由於
不知道關於C#編碼爲字節的事情,我不認爲這件事情終止了結果字符串?我不明白它是怎麼可能的,因爲它的文檔說如果字符串是空的,結果字節數組是*零*長度(這意味着在最基本的條件下沒有終止符,實際內容少得多。 )。我可能是錯的(可能是),但值得調查。也許從'std :: string s(t,recvMsg.size())'這樣的範圍構建一個字符串'''會更好。 – WhozCraig
不,你可能會看到一些東西,讓我看看這個 – SilverBackApe
你們兩個的確是對的,當編碼發生並且字符串消息被轉換爲數組時,沒有空終止。非常感謝 – SilverBackApe