Skip to content

Commit 05ff657

Browse files
authored
Merge pull request #450 from gummif/gfa/build-examples
Problem: Examples are not compiled
2 parents e80cefa + 379793c commit 05ff657

6 files changed

+99
-9
lines changed

CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,7 @@ option(CPPZMQ_BUILD_TESTS "Whether or not to build the tests" ON)
101101
if (CPPZMQ_BUILD_TESTS)
102102
enable_testing()
103103
add_subdirectory(tests)
104+
if (CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD EQUAL 98 AND CMAKE_CXX_STANDARD GREATER_EQUAL 11)
105+
add_subdirectory(examples)
106+
endif()
104107
endif()

README.md

+11-5
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,22 @@ int main()
5353
sock.send(zmq::str_buffer("Hello, world"), zmq::send_flags::dontwait);
5454
}
5555
```
56-
This a more complex example where we send and receive multi-part messages.
56+
This a more complex example where we send and receive multi-part messages over TCP with a wildcard port.
5757
```c++
5858
#include <iostream>
5959
#include <zmq_addon.hpp>
6060

6161
int main()
6262
{
6363
zmq::context_t ctx;
64-
zmq::socket_t sock1(ctx, zmq::socket_type::pair);
65-
zmq::socket_t sock2(ctx, zmq::socket_type::pair);
66-
sock1.bind("inproc://test");
67-
sock2.connect("inproc://test");
64+
zmq::socket_t sock1(ctx, zmq::socket_type::push);
65+
zmq::socket_t sock2(ctx, zmq::socket_type::pull);
66+
sock1.bind("tcp://127.0.0.1:*");
67+
const std::string last_endpoint =
68+
sock1.get(zmq::sockopt::last_endpoint);
69+
std::cout << "Connecting to "
70+
<< last_endpoint << std::endl;
71+
sock2.connect(last_endpoint);
6872

6973
std::array<zmq::const_buffer, 2> send_msgs = {
7074
zmq::str_buffer("foo"),
@@ -84,6 +88,8 @@ int main()
8488
}
8589
```
8690

91+
See the `examples` directory for more examples. When the project is compiled with tests enabled, each example gets compiled to an executable.
92+
8793
Compatibility Guidelines
8894
========================
8995

examples/CMakeLists.txt

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
2+
3+
project(cppzmq-examples CXX)
4+
5+
# place binaries and libraries according to GNU standards
6+
7+
include(GNUInstallDirs)
8+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
9+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
10+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
11+
12+
find_package(Threads)
13+
14+
add_executable(
15+
pubsub_multithread_inproc
16+
pubsub_multithread_inproc.cpp
17+
)
18+
target_link_libraries(
19+
pubsub_multithread_inproc
20+
PRIVATE cppzmq ${CMAKE_THREAD_LIBS_INIT}
21+
)
22+
23+
add_executable(
24+
hello_world
25+
hello_world.cpp
26+
)
27+
target_link_libraries(
28+
hello_world
29+
PRIVATE cppzmq ${CMAKE_THREAD_LIBS_INIT}
30+
)
31+
32+
add_executable(
33+
multipart_messages
34+
multipart_messages.cpp
35+
)
36+
target_link_libraries(
37+
multipart_messages
38+
PRIVATE cppzmq ${CMAKE_THREAD_LIBS_INIT}
39+
)

examples/hello_world.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include <zmq.hpp>
2+
3+
int main()
4+
{
5+
zmq::context_t ctx;
6+
zmq::socket_t sock(ctx, zmq::socket_type::push);
7+
sock.bind("inproc://test");
8+
sock.send(zmq::str_buffer("Hello, world"), zmq::send_flags::dontwait);
9+
}

examples/multipart_messages.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <iostream>
2+
#include <zmq_addon.hpp>
3+
4+
int main()
5+
{
6+
zmq::context_t ctx;
7+
zmq::socket_t sock1(ctx, zmq::socket_type::push);
8+
zmq::socket_t sock2(ctx, zmq::socket_type::pull);
9+
sock1.bind("tcp://127.0.0.1:*");
10+
const std::string last_endpoint =
11+
sock1.get(zmq::sockopt::last_endpoint);
12+
std::cout << "Connecting to "
13+
<< last_endpoint << std::endl;
14+
sock2.connect(last_endpoint);
15+
16+
std::array<zmq::const_buffer, 2> send_msgs = {
17+
zmq::str_buffer("foo"),
18+
zmq::str_buffer("bar!")
19+
};
20+
if (!zmq::send_multipart(sock1, send_msgs))
21+
return 1;
22+
23+
std::vector<zmq::message_t> recv_msgs;
24+
const auto ret = zmq::recv_multipart(
25+
sock2, std::back_inserter(recv_msgs));
26+
if (!ret)
27+
return 1;
28+
std::cout << "Got " << *ret
29+
<< " messages" << std::endl;
30+
return 0;
31+
}

examples/pubsub_multithread_inproc.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ void SubscriberThread1(zmq::context_t *ctx) {
4040
zmq::recv_result_t result =
4141
zmq::recv_multipart(subscriber, std::back_inserter(recv_msgs));
4242
assert(result && "recv failed");
43+
assert(*result == 2);
4344

44-
std::cout << "Thread2: [" << recv_msgs[0].to_string_view() << "] "
45-
<< recv_msgs[1].to_string_view() << std::endl;
45+
std::cout << "Thread2: [" << recv_msgs[0].to_string() << "] "
46+
<< recv_msgs[1].to_string() << std::endl;
4647
}
4748
}
4849

@@ -60,9 +61,10 @@ void SubscriberThread2(zmq::context_t *ctx) {
6061
zmq::recv_result_t result =
6162
zmq::recv_multipart(subscriber, std::back_inserter(recv_msgs));
6263
assert(result && "recv failed");
64+
assert(*result == 2);
6365

64-
std::cout << "Thread3: [" << recv_msgs[0].to_string_view() << "] "
65-
<< recv_msgs[1].to_string_view() << std::endl;
66+
std::cout << "Thread3: [" << recv_msgs[0].to_string() << "] "
67+
<< recv_msgs[1].to_string() << std::endl;
6668
}
6769
}
6870

0 commit comments

Comments
 (0)