2014-04-13 27 views
0

我有一個客戶端服務器應用程序,它將數據從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]接收垃圾數據。

請幫助我,如果你看到我沒有看到的東西。

由於

+1

不知道關於C#編碼爲字節的事情,我不認爲這件事情終止了結果字符串?我不明白它是怎麼可能的,因爲它的文檔說如果字符串是空的,結果字節數組是*零*長度(這意味着在最基本的條件下沒有終止符,實際內容少得多。 )。我可能是錯的(可能是),但值得調查。也許從'std :: string s(t,recvMsg.size())'這樣的範圍構建一個字符串'''會更好。 – WhozCraig

+0

不,你可能會看到一些東西,讓我看看這個 – SilverBackApe

+0

你們兩個的確是對的,當編碼發生並且字符串消息被轉換爲數組時,沒有空終止。非常感謝 – SilverBackApe

回答

0

在轉換爲字節C#字符串不是空終止,和C++串期望一個空終止指針。

所以我相信這裏發生了什麼是一個緩衝區溢出,你在讀這不屬於字符串內存。

+0

我附加了一個空終止符,如msg + =「\ 0」;到C#客戶端中的字符串的末尾,它似乎已經完成了這個技巧。所以我非常感謝你的幫助。 – SilverBackApe

相關問題