В программе нужно реализовать прием пакетов по UDP-протоколу в буфер приема, а затем сформировать выходное сообщение на основе принятых данных. Сам буфер было решено выполнить на основе очереди типа FIFO.
Вначале перед функцией main() нужно объявить следующую структуру:
typedef struct {
unsigned int num; // порядковый номер пакета
char data[20]; // данные пакета (20 байт)
} PACKAGE;
Затем, в функции main() сформировать объект очереди с помощью команды: std::deque buff;
Принятые пакеты следует добавлять в начало очереди (слева), а извлекать с ее конца (справа). Пакеты могут приходить в произвольном порядке. Добавьте последовательно в буфер buff информационные пакеты, прочитанные из входного потока с помощью следующего фрагмента программы: int x;
char s[20];
PACKAGE p;
while (!feof(stdin)) {
cin >> x;
fgetc(stdin);
fgets(s, sizeof(s), stdin);
for (int i = 0; i < sizeof(s); ++i)
if (s[i] == '\n' || s[i] == '\r') s[i] = '\0';
p.num = x;
strcpy(p.data, s);
buff.push_front(p);
}
Извлеките эти пакеты из очереди и данные (поле data) занесите в следующий массив в соответствии с порядковыми номерами num: char data_str[100];
То есть, в массиве data_str должен сначала идти фрагмент data с num = 1 (9 байт строки), сразу за ним второй фрагмент data с num = 2 (9 байт строки) и так до последнего принятого фрагмента (в последнем фрагменте число байт может быть меньше 9). Последним значением (сразу после всех записанных информационных символов) в data_str занесите символ конца строки '\0'. Отобразите на экране сформированную строку data_str.
Код:
#include
#include
#include
typedef struct {
unsigned int num; // порядковый номер пакета
char data[20]; // данные пакета (20 байт)
} PACKAGE;
int main(void)
{
using namespace std;
vector buff;
int x;
char s[20];
PACKAGE p;
while (!feof(stdin)) {
cin >> x;
fgetc(stdin);
fgets(s, sizeof(s), stdin);
for (int i = 0; i < sizeof(s); ++i)
if (s[i] == '\n' || s[i] == '\r')
s[i] = '\0';
p.num = x;
strcpy(p.data, s);
buff.push_back(p);
}
char data_str[100];
int offset = 0;
for (int i = buff.size() - 1; i >= 0; --i) {
PACKAGE packet = buff[i];
int length = strlen(packet.data);
strncpy(data_str + offset, packet.data, length);
offset += length;
}
data_str[offset] = '\0';
cout