ZMQ釋出-訂閱模式踩坑之——訊息丟失部分

Pisces_224發表於2021-01-04

如題

最近在研究釋出訂閱者模式時,網上找的例子執行後沒啥問題,但自己將其嵌入生產者消費者模式之後,出現了訂閱端收到訊息丟失很大一部分的問題。後逐漸排查,問題出在這裡:

 zmq_send(publisher, sdata.c_str(), sizeof(sdata.c_str()) + 1, 0);

原因是zmq_send()函式第二個引數型別是void *,我在這之前要傳送的訊息是string型別,然後想當然的呼叫了c_str()函式將其轉為字串樣式。結果訂閱端收到缺胳膊少腿的訊息。。。

注意

語法:
const char c_str();
c_str()函式返回一個指向正規C字串的指標, 內容與本string串相同.
這是為了與c語言相容,在c語言中沒有string型別,故必須通過string類物件的成員函式c_str()把string 物件轉換成c中的字串樣式。
注意:一定要使用strcpy()函式 等來操作方法c_str()返回的指標
比如:最好不要這樣:
char
c;
string s=“1234”;
c = s.c_str(); //c最後指向的內容是垃圾,因為s物件被析構,其內容被處理
應該這樣用:
char c[20];
string s=“1234”;
strcpy(c,s.c_str());
這樣才不會出錯,c_str()返回的是一個臨時指標,不能對其進行操作
再舉個例子
c_str() 以 char* 形式傳回 string 內含字串
如果一個函式要求char*引數,可以使用c_str()方法:
string s = “Hello World!”;
printf("%s", s.c_str()); //輸出 “Hello World!”

看到這裡應該明白了,要想將其正確轉為字元陣列,使用c_str()必須通過呼叫strcpy()函式方才可以返回正確的字元指標,以進行後續操作。

菜鳥努力中,重在堅持,加油!

參考老哥的部落格:
c++ 中 char 與 string 之間的相互轉換問題

相關文章