次のサーバーおよびクライアントコードは、the official tutorialのわずかに変更されたバージョンです。彼らの出力の私の解釈は、彼らが送受信するものは常に1バイトであるということです。これはどうしたらできますか?ZeroMQは常に1バイトを送信して取得します(cppzmqバインディングを使用)
server.cpp:
#include <zmq.hpp>
#include <string>
#include <iostream>
#ifndef _WIN32
#include <unistd.h>
#else
#include <windows.h>
#define sleep(n) Sleep(n)
#endif
int main() {
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:5555");
while(true){
zmq::message_t request;
int length=socket.recv(&request);
if(length >= 0)
std::cout << length << " bytes received:" << std::string((char*)request.data(),length) << ":" << std::endl;
sleep(1);
zmq::message_t reply(5);
memcpy(reply.data(), "World", 5);
socket.send(reply);
}
return 0;
}
サーバーouputを:
1 bytes received:H:
client.cpp:
#include <zmq.hpp>
#include <string>
#include <iostream>
int main()
{
zmq::context_t context(1);
zmq::socket_t socket(context,ZMQ_REQ);
socket.connect ("tcp://localhost:5555");
zmq::message_t request(5);
memcpy(request.data(),"Hello",5);
std::cout << socket.send(request) << " bytes sent." << std::endl;
zmq::message_t reply;
int length=socket.recv(&reply);
if(length >= 0)
std::cout << length << " bytes received:" << std::string((char*)request.data(),length) << ":" << std::endl;
return 0;
}
クライアント出力:
1 bytes sent.
1 bytes received:H:
このような奇妙な結果が出たとき、私はZeroMQの使い方を誤解している可能性があると考え始めます。私はこの「 Minor Note on Strings」を繰り返し読んでいます。
ゼロサイズは送信するデータについて、そのサイズ(バイト数)以外は何も分かりません。つまり、アプリケーションが安全にフォーマットできるようにすることで、アプリケーションはそれを読み取ることができます。それでは、ZeroMQ文字列の長さが指定され、末尾のヌルなしワイヤー上で送信されるルールを確立しましょう
:この文が続いている
、。
これらの2つの段落は矛盾しています。 ZeroMQが送信するコンテンツは何ですか?
C++を使用している場合は、なぜC言語のように書いていますか? 'zmq :: message_t {" hello "、5}'(C++ 11より古いものを使用している場合は中カッコをかっこに置き換えます) – Olipro
@olipro見つからないバージョン4.0.5の 'zmq.hpp'ファイルの' zmq :: message_t(char *、size_t) 'のようなコンストラクタです。 –