Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 27.01.2021
Сообщений: 29
1

Передача массива в системе клиент\сервер

04.10.2021, 12:01. Показов 6389. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код для сервера и для клиента, мне нужно добавить передачу массива вещественных чисел. Как это сделать? Подскажите какой код надо дописать чтоб сразу весь массив передавался...

СЕРВЕР код -

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
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <winsock2.h> // Wincosk2.h повинен бути раніше windows!
#include <windows.h>
#include <clocale>
#define MY_PORT 777 // Порт, який слухає сервер
// Макрос для друку кількості активних користувачів
#define PRINTNUSERS if (nclients) printf ( "% d user on_line \n", nclients); else printf ( "No User on line \n");
// Прототип функції, обслуговуючої підключення
DWORD WINAPI ToClient(LPVOID client_socket);
// Глобальна змінна – кількість активних користувачів
int nclients = 0;
int main(int argc, char* argv[])
{
 setlocale(LC_CTYPE, "rus");
 char buff[1024]; // Буфер для різних потреб
 printf("TCP SERVER DEMO \n");
 // Крок 1 – Ініціалізація бібліотеки сокетів
 // Так як повернута функцією інформація не використовується,
 // Їй передається покажчик на робочий буфер, перетворений до покажчика
 // На структуру WSADATA.
 // Такий прийом дозволяє заощадити одну змінну, однак буфер
 // Повинен бути не менше півкілобайта за розміром (структура WSADATA
 // Займає 400 байт)
 if (WSAStartup(0x0202, (WSADATA*)&buff[0]))
 {
  // Помилка
  printf("Error WSAStartup % d \n", WSAGetLastError());
  return -1;
 }
 // Крок 2 - створення сокета
 SOCKET mysocket;
 // AF_INET _ сокет Інтернету
 // SOCK_STREAM - потоковий сокет (з установкою з'єднання)
 // 0 - за замовчуванням вибирається TCP-протокол
 if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
 {
  // Помилка
  printf("Error socket % d \n", WSAGetLastError());
  WSACleanup(); // Деініціалізацію бібліотеки Winsock
  return -1;
 }
 // Крок 3 - зв'язування сокета з локальною адресою
 sockaddr_in local_addr;
 local_addr.sin_family = AF_INET;
 local_addr.sin_port = htons(MY_PORT);
 local_addr.sin_addr.s_addr = 0; // Сервер приймає підключення
 // На всі свої IP-адреси
 // Викликаємо bind для зв'язування
 if (bind(mysocket, (sockaddr*)&local_addr, sizeof(local_addr)))
 {
  // Помилка
  printf("Error bind % d \n", WSAGetLastError());
  closesocket(mysocket); // Закриваємо сокет
  WSACleanup();
  return -1;
 }
 // Крок 4 - очікування підключень
 // Розмір черги - 0x100
 if (listen(mysocket, 0x100))
 {
  // Помилка
  printf("Error listen % d \n", WSAGetLastError());
  closesocket(mysocket);
  WSACleanup();
  return -1;
 }
 printf("Ожидание подключения ... \n");
 // Крок 5 - витягаємо повідомлення з черги
 SOCKET client_socket; // Сокет для клієнта
 sockaddr_in client_addr; // Адреса клієнта (заповнюється системою)
 // Функції accept необхідно передати розмір структури
 int client_addr_size = sizeof(client_addr);
 // Цикл вилучення запитів на підключення з черги
 while ((client_socket = accept(mysocket, (sockaddr*)&client_addr, &client_addr_size)))
 {
  nclients++; // Збільшуємо лічильник підключених клієнтів
  // Намагаємося отримати ім'я хоста
  HOSTENT* hst;
  hst = gethostbyaddr((char*)&client_addr.sin_addr.s_addr, 4, AF_INET);
  // Виведення відомостей про клієнта
  printf(" + % s[% s] new connect!\n", (hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
  PRINTNUSERS
   // Виклик нового потоку для обслуговування клієнта
   // Для цього рекомендується використовувати _beginthreadex,
   // Але, оскільки ніяких викликів функцій стандартної Сі-бібліотеки
   // потік не робить, можна обійтися і CreateThread
   DWORD thID;
  CreateThread(NULL, NULL, ToClient, &client_socket, NULL, &thID);
 }
 return 0;
}
// Ця функція створюється в окремому потоці і обслуговує
// чергового підключеного клієнта незалежно від інших.
DWORD WINAPI ToClient(LPVOID client_socket)
{
 SOCKET my_sock;
 my_sock = ((SOCKET*)client_socket)[0];
 char buff[20 * 1024];
#define sHELLO "Hello, Student \r \n"
 // Відправляємо клієнту вітання
 send(my_sock, sHELLO, sizeof(sHELLO), 0);
 // Цикл луна-сервера: прийом рядка від клієнта і повернення її клієнту
 int bytes_recv;
 while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) && bytes_recv!= SOCKET_ERROR) send(my_sock, &buff[0], bytes_recv, 0);
 // Якщо ми тут, то стався вихід з циклу через
 // Повернення функцією recv помилки - з'єднання з клієнтом розірвано
 nclients--; // Зменшуємо лічильник активних клієнтів
 printf(" - disconnect \n");
 PRINTNUSERS
  // Закриваємо сокет
  closesocket(my_sock);
 return 0;
}
КЛИЕНТ код -


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
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <clocale>
#define PORT 777
#define SERVERADDR "127.0.0.1"
int main(int argc, char* argv[])
{
 setlocale(LC_CTYPE, "rus");
 char buff[1024];
 printf("TCP DEMO CLIENT \n");
 // Крок 1 - ініціалізація бібліотеки Winsock
 if (WSAStartup(0x202, (WSADATA*)&buff[0]))
 {
  printf("WSAStart error % d \n", WSAGetLastError());
  return -1;
 }
 // Крок 2 - створення сокета
 SOCKET my_sock;
 my_sock = socket(AF_INET, SOCK_STREAM, 0);
 if (my_sock < 0)
 {
  printf("Socket() error % d \n", WSAGetLastError());
  return -1;
 }
 // Крок 3 - щоб установити
 // Заповнення структури sockaddr_in - вказівка адреси і порту сервера
 sockaddr_in dest_addr;
 dest_addr.sin_family = AF_INET;
 dest_addr.sin_port = htons(PORT);
 HOSTENT* hst;
 // Перетворення IP-адреси з символьної в мережевий формат
 if (inet_addr(SERVERADDR)!= INADDR_NONE)
  dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
 else
  // Спроба отримати IP адресу за доменним ім'ям сервера
  if (hst = gethostbyname(SERVERADDR))
   // Hst-> h_addr_list містить не масив адрес,
   // А масив покажчиків на адреси
   ((unsigned long*)& dest_addr.sin_addr)[0] = ((unsigned long**)hst->h_addr_list)[0][0];
  else
  {
   printf("Invalid address %s \n", SERVERADDR);
   closesocket(my_sock);
   WSACleanup();
   return -1;
  }
 // Адресу сервера отримано - намагаємося встановити з'єднання
 if (connect(my_sock, (sockaddr*)&dest_addr, sizeof(dest_addr)))
 {
  printf("Connect error % d \n", WSAGetLastError());
  return -1;
 }
 printf("Связь % s успешно установлена \n Type quit for quit \n \n", SERVERADDR);
  // Крок 4 - читання і передача повідомлень
  int nsize;
 while ((nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0))!= SOCKET_ERROR)
 {
  float f = 123.45;
  char* buf = (char*)&f;//массив char на 4 элемента
  //и обратно
  printf("%e\n", *(float*)buf);
  // Ставимо завершальний нуль в кінці рядка
  buff[nsize] = 0;
  // Виводимо на екран
  printf("S = > C: % s", buff);
  // Читаємо користувацьке введення з клавіатури
  printf("S <= C:"); fgets(&buff[0], sizeof(buff) - 1, stdin);
  // Перевірка на «quit»
  if (!strcmp(&buff[0], "quit \n"))
  {
   // Коректний вихід
   printf("Exit ...");
   closesocket(my_sock);
   WSACleanup();
   return 0;
  }
  // Передаємо рядок клієнта серверу
  send(my_sock, &buff[0], nsize, 0);
 }
 printf("Recv error % d \n", WSAGetLastError());
 closesocket(my_sock);
 WSACleanup();
 return -1;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2021, 12:01
Ответы с готовыми решениями:

Обмен данными между двумя приложениями по системе клиент-сервер
Всем доброго времени суток. Хочу сразу же уточнить, что готовый код меня не интересует. Нужны...

Клиент-серверное приложение - передача потокового видео на сервер
Прошу помощи. Суть такова нужно написать приложение клиент(с++)(win/linux) сервер(php) которое...

Клиент-сервер. Передача массива и числа.
Клиент передает массив и число А, сервер умножает все элементы массива на число А помогите...

Передача файлов клиент-сервер-клиент используя Socket
Добрый день! Срочно нужна помощь. Мне нужно передать файлы с клиента на сервер и обратно,...

1
-87 / 21 / 8
Регистрация: 11.10.2021
Сообщений: 122
12.10.2021, 00:26 2
Размер double, который скорее всего ты собираешься использовать 64 бита, просто передавай их последовательно. Проблем никаких не будет, а если ты хочешь переносимость сервера или клиента, то используй сетевой порядок байт для них, но у тебя все на винде так что это может не иметь смысла.

C
1
2
3
4
5
6
7
8
...
 
double a[64];
 
for (size_t i = 0; i < sizeof(a) / sizeof(*a); i++)
    send(s, &a[i], sizeof(a[i]), 0);
 
...
Примерно так это будет выглядить, если не учитывать сетевой порядок байт.

C
1
2
3
4
5
6
7
8
9
10
11
12
...
 
double a[64];
 
for (size_t i = 0; i < sizeof(a) / sizeof(*a); i++)
{
    uint64_t temporary = htond(a[i])
 
    send(s, &temporary, sizeof(temporary), 0);
}
 
...
С сетевым порядком байт вроде так будет, не проверял.
0
12.10.2021, 00:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2021, 00:26
Помогаю со студенческими работами здесь

Обрезается сообщение в системе: клиент - сервер
Изучаю &quot;Самоучитель игры на WINSOCK&quot;. Использую пример TCP клиента и сервера, при отправке...

Клиент-Сервер: передача байтов
Здравствуйте! Написала приложения клиента и сервера. Может, кто подскажет, как сделать буфер...

Передача данных клиент-сервер
Добрый день, пытаюсь разобраться с передачей данных клиент-сервер. Вот кое-как по примерам в...

Передача файлов клиент-сервер
Здравствуйте. Мне нужно организовать передачу файла из одной папки в другую. Клиент отправляет,а...

Передача и получение клиент-сервер
У меня программа- консольное приложение с архитектурой клиент-сервер. Также сервер подключен к базе...

Передача данных Клиент-сервер-клиенты
Как передавать не строчные значения, а к примеру координаты float, целочисленные и логику? //...

Клиент Сервер -передача видео и строк
Есть задача, незнаю как ее лучше реализовать. Задача: Сервер принимает команды ввиде строки от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru