-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_msg_client.c
178 lines (156 loc) · 6.37 KB
/
test_msg_client.c
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// test_msg_client.c: Программа тестирует работу протокола передачи сообщений
// TCP/IP со стороны источника сообщений.
//
// Компиляция:
// gcc test_msg_client.c msg_conn.c msg_buf.c -o test_msg_client
//
#include <sys/time.h> // gettimeofday()
#include <unistd.h> // usleep()
#include <signal.h> // signal()
#include <stdlib.h> // atoi()
#include <string.h> // memcpy()
#include <math.h> // sin(), cos(), M_PI
#include <stdio.h>
#include "msg_conn.h"
// composeMsgCloud: Создаем тестовое сообщение с облаком точек.
//
// Исходные данные:
// buf - указатель на стуктуру неинициализированного буфера
// mtu - максимальный размер одного пакета сообщения
// index - порядковый номер сообщения (от начала сессии)
// Vsize - размер поля по оси X
// Wsize - размер поля по оси Y
// step - шаг расстояния между точками
//
// Возвращаемые данные:
// записываются в поля структуры buf.
//
BOOL composeMsgCloud(MsgBuffer* buf, size_t mtu, size_t index,
float step, float Vsize, float Wsize)
{
BOOL status;
MsgHeader msg;
struct timeval time;
float Vij = 0; // вспомогательные переменные для
float Wij = 0; // расчета координат облака точек
float* ptr = NULL;
// Вычисляем количество точек облака по каждой оси
size_t Vn = Vsize / step; // кол-во точек по одной оси
size_t Wn = Wsize / step; // кол-во точек по другой оси
// Определяем текущее системное время
gettimeofday(&time, NULL);
// Создаем заголовок сообщения
msg.index = index;
msg.timestampNs = time.tv_sec * 1.0e9 + time.tv_usec * 1.0e3;
msg.type = MsgTypePointCloud;
msg.uni.cloud.trackerState = 1;
msg.uni.cloud.integralState = 1;
msg.uni.cloud.translation[0] = 1.0;
msg.uni.cloud.translation[1] = 0.2;
msg.uni.cloud.translation[2] = 0;
double angleRad = 0.1 * M_PI;
msg.uni.cloud.rotation[0] = 0; // будет поворот вокруг оси Z
msg.uni.cloud.rotation[1] = 0;
msg.uni.cloud.rotation[2] = sin(0.5 * angleRad);
msg.uni.cloud.rotation[3] = cos(0.5 * angleRad);
msg.uni.cloud.npts = Vn * Wn;
msg.magicNumber = MSG_HEADER_MAGIC;
// Выделяем буфер для сообщения
status = MsgBufferInit(buf, &msg, mtu);
if (status)
{
// Записываем заголовок сообщения в буфер сообщения
memcpy(buf->data, &msg, sizeof(MsgHeader));
// Записываем координаты облака точек в буфер сообщения
ptr = (float*) (buf->data + sizeof(MsgHeader));
for (size_t i = 0; i < Vn; i++)
{
Vij = -0.5f * Vsize + step * i;
for (size_t j = 0; j < Wn; j++)
{
Wij = -0.5f * Wsize + step * j;
*ptr++ = 0;
*ptr++ = Vij;
*ptr++ = Wij;
}
}
}
else
{
printf("Failed to init message buffer!\n");
}
return status;
}
// Функция для обработки сигнала Ctrl+C (для остановки приложения)
BOOL needToExit = FALSE;
void signal_handler(int signum)
{
printf("Stopping application...\n");
needToExit = TRUE;
}
int main(int argc, char *argv[])
{
MsgConnConfig cfg; // конфигурация соединения
MsgConn conn; // объект соединения
MsgBuffer buf; // буфер сообщения
size_t index = 0; // счетчик сообщений
// Регистрируем функцию обработки сигнала
//signal(SIGINT, signal_handler);
struct sigaction a;
a.sa_handler = signal_handler;
a.sa_flags = 0;
sigemptyset( &a.sa_mask );
sigaction( SIGINT, &a, NULL );
// Анализируем параметры командной строки
if (argc < 3)
{
printf("Missing command line arguments!\n");
printf("Usage:\n");
printf(" %s hostname port\n", argv[0]);
return -1;
}
// Инициализируем структуру конфигурации соединения
cfg.connRole = MsgConnRoleTcpSender;
strncpy(cfg.servername, argv[1], sizeof(cfg.servername));
cfg.portno = atoi(argv[2]);
cfg.mtu = 1460*10; // максимальный размер одного пакета
cfg.maxListLength = 10; // максимальная длина очереди сообщений
// Инициализируем объект соединения
if (!MsgConnInit(&conn, &cfg))
{
printf("Failed to init client connection!\n");
return -1;
}
printf("Talking to host %s port %d...\n", cfg.servername, cfg.portno);
// В цикле отправляем несколько сообщений
index = 0;
while (/*index < 1000 &&*/ !needToExit)
{
// Делаем паузу перед отправкой нового сообщения
usleep(330000);
// Составляем новое сообщение
if (composeMsgCloud(&buf, cfg.mtu, index, 0.1, 4.0, 6.0))
{
// Отправляем сообщение
if (MsgConnSend(&conn, &buf))
{
printf("Message no. %04d was sent!\n", (int)index);
}
else
{
printf("Message no. %04d failed to send!\n", (int)index);
}
// Освобождаем память, выделенную под буфер сообщения
MsgBufferFree(&buf);
}
else
{
printf("Failed to compose message no. %04d!\n", (int)index);
}
// Инкрементируем индекс сообщения
index++;
}
// Завершаем работу приложения
MsgConnFree(&conn);
return 0;
}