-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsample_main.cpp
More file actions
160 lines (128 loc) · 5.28 KB
/
sample_main.cpp
File metadata and controls
160 lines (128 loc) · 5.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#define OSC_NET_IGNORE_DEPRECATION_WARNINGS
#define OSC_NET_IMPLEMENTATION
#include "tinyosc-net.hpp"
#include "tinyosc.hpp"
#include <iostream>
#include <thread>
#define OSC_UDP_PORT_NUM_DEMO 9109
void open_udp_server()
{
osc_net_address_t server_addr;
osc_net_get_address(&server_addr, nullptr, OSC_UDP_PORT_NUM_DEMO);
osc_net_socket_t server_socket;
if (osc_net_udp_socket_open(&server_socket, server_addr, false))
{
std::cout << "osc_net_udp_socket_open osc_net_err: " << osc_net_get_error() << std::endl;
}
else
{
std::cout << ">>>>>>>>>>>>>>>>>> Server started, will listen to packets on UDP port " << OSC_UDP_PORT_NUM_DEMO << std::endl;
tinyosc::osc_packet_reader packet_reader;
tinyosc::osc_packet_writer packet_writer;
while (true)
{
std::vector<uint8_t> recv_byte_buffer(1024 * 128);
osc_net_address_t sender;
if (auto bytes = osc_net_udp_socket_receive(&server_socket, &sender, recv_byte_buffer.data(), recv_byte_buffer.size(), 30))
{
packet_reader.initialize_from_ptr(recv_byte_buffer.data(), recv_byte_buffer.size());
tinyosc::osc_message * msg;
while (packet_reader.check_error() && (msg = packet_reader.pop_message()) != 0)
{
int pingInt32Arg;
if (msg->match_complete("/ping").pop_int32(pingInt32Arg).check_no_more_args())
{
std::cout << "\tServer: received /ping " << pingInt32Arg << " from " << sender.host << "\n";
tinyosc::osc_message reply;
reply.initialize("/pong").push_int32(pingInt32Arg + 1);
packet_writer.reset().add_message(reply);
if (osc_net_udp_socket_send(&server_socket, sender, packet_writer.data(), packet_writer.size()))
{
std::cout << "osc_net_udp_socket_send osc_net_err: " << osc_net_get_error() << std::endl;
}
}
else
{
std::cout << "Server: unhandled message: " << *msg << "\n";
}
}
}
}
}
}
void open_udp_client()
{
osc_net_address_t local_addr;
if (osc_net_get_address(&local_addr, "127.0.0.1", OSC_UDP_PORT_NUM_DEMO))
{
std::cout << "osc_net_get_address osc_net_err: " << osc_net_get_error() << std::endl;
}
osc_net_socket_t client_socket;
if (osc_net_udp_socket_open(&client_socket, local_addr, false))
{
std::cout << "osc_net_udp_socket_open osc_net_err: " << osc_net_get_error() << std::endl;
}
else
{
std::cout << "Client started, will send packets to port " << OSC_UDP_PORT_NUM_DEMO << std::endl;
int iping = 1;
while (true)
{
tinyosc::osc_message msg("/ping");
msg.push_int32(iping);
tinyosc::osc_packet_writer packet_writer;
packet_writer.start_bundle().start_bundle().add_message(msg).end_bundle().end_bundle();
if (osc_net_udp_socket_send(&client_socket, local_addr, packet_writer.data(), packet_writer.size()))
{
std::cout << "osc_net_udp_socket_send osc_net_err: " << osc_net_get_error() << std::endl;
}
std::cout << "Client: sent /ping " << iping++ << "\n";
std::vector<uint8_t> recv_byte_buffer(1024 * 128);
osc_net_address_t sender;
if (auto bytes = osc_net_udp_socket_receive(&client_socket, &sender, recv_byte_buffer.data(), recv_byte_buffer.size(), 30))
{
tinyosc::osc_packet_reader packet_reader(recv_byte_buffer.data(), recv_byte_buffer.size());
tinyosc::osc_message * incoming_msg;
while (packet_reader.check_error() && (incoming_msg = packet_reader.pop_message()) != 0)
{
std::cout << "Client: received " << *incoming_msg << "(" << bytes << " bytes) \n";
}
}
else
{
std::cout << "osc_net_udp_socket_receive osc_net_err: " << osc_net_get_error() << std::endl;
}
}
//std::cout << "sock error: " << sock.errorMessage() << " -- is the server running?\n";
}
}
void open_tcp_server()
{
// @todo
}
void open_tcp_client()
{
// @todo
}
int main(int argc, char * argv[])
{
// Test instantiations of tinyosc objects
tinyosc::osc_message msg;
tinyosc::osc_packet_reader reader;
tinyosc::osc_packet_writer writer;
// Do platform-specific network stack bringup
osc_net_init();
std::thread server_thread = std::thread([]() {
open_udp_server();
});
std::this_thread::sleep_for(std::chrono::seconds(1));
std::thread client_thread = std::thread([]() {
open_udp_client();
});
std::this_thread::sleep_for(std::chrono::seconds(20));
server_thread.join();
client_thread.join();
// Do platform-specific network stack teardown
osc_net_shutdown();
return 0;
}