文字列の代わりに構造体を書けばよいのでは?
C++
1#include <sys/types.h>
2#include <sys/socket.h> // socket, bind, sendto, recv
3#include <netinet/in.h> // sockaddr_in
4#include <arpa/inet.h> // inet_addr
5#include <unistd.h> // close
6#include <stdio.h> // printf
7#include <stdlib.h> // atoi
8
9struct msg { int x, y, z; };
10
11class simple_udp {
12 int sock;
13 struct sockaddr_in addr;
14public:
15 simple_udp(const char *address, int port) {
16 sock = socket(AF_INET, SOCK_DGRAM, 0);
17 addr.sin_family = AF_INET;
18 addr.sin_addr.s_addr = inet_addr(address);
19 addr.sin_port = htons(port);
20 }
21 void udp_send(const msg &data) {
22 sendto(sock, &data, sizeof(msg), 0, (struct sockaddr *)&addr, sizeof(addr));
23 }
24 void udp_bind(){
25 bind(sock, (const struct sockaddr *)&addr, sizeof(addr));
26 }
27 void udp_recv(msg &data){
28 recv(sock, &data, sizeof(msg), 0);
29 }
30
31 ~simple_udp(){
32 close(sock);
33 }
34};
35
36void send(int argc, char **argv)
37{
38 msg data = { atoi(argv[1]), atoi(argv[2]), atoi(argv[3]) };
39 simple_udp udp0("127.0.0.1", 4001);
40 udp0.udp_send(data);
41}
42
43void recv()
44{
45 simple_udp udp0("0.0.0.0", 4001);
46 udp0.udp_bind();
47 while (1) {
48 msg data;
49 udp0.udp_recv(data);
50 printf("recv: %d %d %d\n", data.x, data.y, data.z);
51 }
52}
53
54int main(int argc, char **argv)
55{
56 if (argc == 4)
57 send(argc, argv);
58 else if (argc == 1)
59 recv();
60}
エラーチェックをしていないので、原理を知るためだけのコードです。