我正在尝试使用 ZMQ 草案规范ZMQ_RADIO
and ZMQ_DISH
。我用 CMake 构建了 libzmq 和 cppzmqExternalProject
和旗帜ENABLE_DRAFTS=ON
并验证它是使用草稿建造的zmq_has()
功能。我修改了标准你好世界示例 http://zguide.zeromq.org/cpp:hwserver使用收音机和碟形天线,但无法让他们说话。我还收到编译错误ZMQ_RADIO
and ZMQ_DISH
未定义。我手动定义它们并进行编译,但我从未获得实际连接,因此似乎还有其他问题。
这是我的代码:
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.11)
project(zmq_udp)
include(ExternalProject)
ExternalProject_Add(libzmq
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG master
CMAKE_ARGS
-DENABLE_DRAFTS=ON
-DWITH_PERF_TOOL=OFF
-DZMQ_BUILD_TESTS=OFF
-DENABLE_CPACK=OFF
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/zmq
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_BINARY_DIR}/zmq/lib
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}
)
ExternalProject_Add(cppzmq
GIT_REPOSITORY https://github.com/zeromq/cppzmq
GIT_TAG master
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/zmq.hpp ${CMAKE_BINARY_DIR}/zmq/include/zmq.hpp
TEST_COMMAND ""
)
add_dependencies(cppzmq libzmq)
set(ZEROMQ_LIBNAME "libzmq.so")
set(ZEROMQ_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/zmq/include)
set(ZEROMQ_LIBRARIES ${CMAKE_BINARY_DIR}/zmq/lib/${ZEROMQ_LIBNAME})
include_directories(${ZEROMQ_INCLUDE_DIRS})
add_executable(server server.cpp)
add_executable(client client.cpp)
add_dependencies(server cppzmq)
add_dependencies(client cppzmq)
target_link_libraries(server ${ZEROMQ_LIBRARIES})
target_link_libraries(client ${ZEROMQ_LIBRARIES})
服务器.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#define ZMQ_DISH 15
int main ()
{
std::cout << zmq_has("draft") << std::endl;
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_DISH);
socket.bind ("udp://127.0.0.1:5555");
while (true)
{
zmq::message_t request;
socket.recv (&request);
std::cout << "Received Hello" << std::endl;
}
return 0;
}
客户端.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>
#define ZMQ_RADIO 14
int main ()
{
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_RADIO);
std::cout << "Connecting to hello world server…" << std::endl;
socket.connect ("udp://127.0.0.1:5555");
for (int request_nbr = 0; request_nbr != 10; request_nbr++)
{
zmq::message_t request (5);
memcpy (request.data (), "Hello", 5);
std::cout << "Sending Hello " << request_nbr << "…" << std::endl;
socket.send (request);
sleep(1);
}
return 0;
}
服务器按照预期输出 1zmq_has()
函数,它应该验证 libzmq 是在草稿 API 模式下构建的。
我需要做什么才能获得RADIO/DISH
能正常工作吗?
我想在项目中使用 ZMQ 作为 UDP 接收器来从非 ZMQ 应用程序接收一些 UDP 数据包。