Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649

Массив сообщений, которыми обмениваются клиент и сервер

19.11.2011, 16:31. Показов 1646. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть написанная программа для создания сокета сервера

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
#include <stdlib.h>
#include <stdio.h>
 
#include <winsock2.h>
#include <windows.h>
 
#include <iostream.h>
 
#pragma comment(lib,"ws2_32.lib")
 
int main (void)
{
    //Инициализируем библиотеку WinSock с промощью вызова функции WSAStartup 
    
    WSADATA wsaData;
 
    if (WSAStartup (0x0202, &wsaData)) 
    {
        //Функция возвращает ненулевое значение, инициализация не удалась
        cout << "Error WSAStartup " << WSAGetLastError() <<"\n";
        return -1;
    }
    
    //Создание сокета Server
    SOCKET Server;
    Server = socket (AF_INET, SOCK_STREAM, 0); 
        //AF_INET протокол Интернета (IP)
        //SOCK_STREAM потоковый сокет
        //0 по умолчанию выбирается TCP протокол
        
    if (Server == INVALID_SOCKET)
    {
        //Если не удалось создать сокет
        cout << "Socket failed " << WSAGetLastError() <<"\n";
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
 
    }
    
    //Связывание сокета Server с локальным адресом (IP-адрес узла и номер порта)
    sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_port = htons(8000); 
    /*htons преобразует номер порта из порядка байтов локальной машины в сетевой порядок байт*/
    //ServerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.2.80");
    //ServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;
    ServerAddr.sin_addr.s_addr = inet_addr("192.168.2.80"); 
            
    if (bind (Server, (sockaddr*)&ServerAddr, sizeof(ServerAddr)))
    {
        //Функция возвращает ненулевое значение, ошибка
        cout << "Bind failed " << WSAGetLastError() <<"\n";
        closesocket(Server); //Закрываем сокет Server
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
    }   
 
    //Перевод потокового сервера в режим ожидания подключений клиента
    if (listen (Server, 1))
    {
        //Функция возвращает ненулевое значение, ошибка
        cout << "Listen failed " << WSAGetLastError() <<"\n";
        closesocket(Server); //Закрываем сокет Server
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
    }
 
    cout << "Waiting...\n";
 
    SOCKET Client; //Сокет для клиента
      sockaddr_in ClientAddr; // Адрес клиента (заполняется системой)
 
    int ClientAddrSize = sizeof(ClientAddr);
 
    //Подключение клиента к сокету Server
    Client = accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize);
    if (Client==INVALID_SOCKET)
    {
        //Действия в случае ошибки
        cout << "Accept failed " << WSAGetLastError() <<"\n";
        closesocket(Server); //Закрываем сокет Server
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
    }
    
closesocket (Server);
 
WSACleanup ();
 
return 0;
}
По заданию сервер и клиент должны обмениваться сообщениями.
Как запрограммировать этот массив сообщений?
Хотя бы на одном примере объясните, пожалуйста?
Вложения
Тип файла: pdf Сообщения.pdf (53.9 Кб, 23 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2011, 16:31
Ответы с готовыми решениями:

Клиент-сервер, прием сообщений
Доброго времени суток. Писал в &quot;С++ для начинающих&quot;, но там никто мне не ответил... Есть программа-сервер с компонентом TServerSocket и...

Клиент-Сервер - передача сообщений
Не могу понять в чем проблема. Передаю серверу сообщение, он его принимает и выдает в поле Memo кракозябры, помогите, по возможности...

Клиент-сервер, прием сообщений и форма
Доброго времени суток. Есть программа-сервер с компонентом TServerSocket и клиент - TClientSocket. С сервера отправляю 5 строк: ...

7
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 16:59
тебе нужно передавать структуры. типа таких:
C++
1
2
3
4
5
6
7
8
struct message {
   unsigned char id;
   unsigned short length;
   struct body {
      unsigned char code;
      char* str;
   };
};
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 17:14
Цитата Сообщение от niXman Посмотреть сообщение
struct message {
* *unsigned char id;
* *unsigned short length;
* *struct body {
* * * unsigned char code;
* * * char* str;
* *};
};
но передавать мы сообщение всеравно то будем как строку поэтому нужна строка расфасовщика

C++
1
2
message mes;
recv(socket,(char*) &mes,sizeof(message),0)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 18:41
Цитата Сообщение от Van111 Посмотреть сообщение
поэтому нужна строка расфасовщика
по этому нужна сериализация/маршалинг
1
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
29.11.2011, 15:52  [ТС]
Написана такая программа для сервера
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <stdlib.h>
#include <stdio.h>
 
#include <winsock2.h>
#include <windows.h>
 
#include <iostream.h>
 
#include <string.h>
#include <time.h>
 
#pragma comment(lib,"ws2_32.lib")
 
#pragma hdrstop
 
WORD wVersionRequested;
 
int CreateServer(void);
int Connection(void);
 
SOCKET Server;
SOCKET Client;
 
//-------------------------------------------------------------------------------------
 
int main (void)
{
    
    srand(time(NULL));
    
    CreateServer();
    Connection();
    closesocket(Server); //Çàêðûâàåì ñîêåò Server
    closesocket(Client); //Çàêðûâàåì ñîêåò Client
    WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
 
return 0;
}
 
//-------------------------------------------------------------------------------------
    
int CreateServer(void)
{
    
    //Èíèöèàëèçèðóåì áèáëèîòåêó WinSock ñ ïðîìîùüþ âûçîâà ôóíêöèè WSAStartup 
    
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(2, 0);
 
    if (WSAStartup (wVersionRequested, &wsaData) != 0) 
    {
        //Ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, èíèöèàëèçàöèÿ íå óäàëàñü
        cout << "Error WSAStartup " << WSAGetLastError() <<"\n";
        return -1;
    }
 
    else cout << "WSAStartup OK\n";
    
    //Ñîçäàíèå ñîêåòà Server
    Server = socket (AF_INET, SOCK_STREAM, 0); 
    //AF_INET ïðîòîêîë Èíòåðíåòà (IP)
    //SOCK_STREAM ïîòîêîâûé ñîêåò
    //0 ïî óìîë÷àíèþ âûáèðàåòñÿ TCP ïðîòîêîë
        
    //Ïðîâåðêà ñîçäàíèÿ ñîêåòà
    if (Server == INVALID_SOCKET)
    {
        //Åñëè íå óäàëîñü ñîçäàòü ñîêåò
        cout << "Socket error " << WSAGetLastError() <<"\n";
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
 
    }
 
    else cout << "Socket OK\n";
        
    //Ñâÿçûâàíèå ñîêåòà Server ñ ëîêàëüíûì àäðåñîì (IP-àäðåñ óçëà è íîìåð ïîðòà)
    sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_port = htons(8000); 
    /*htons ïðåîáðàçóåò íîìåð ïîðòà èç ïîðÿäêà áàéòîâ ëîêàëüíîé ìàøèíû â ñåòåâîé ïîðÿäîê áàéò*/
    ServerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.2.80");
                
    if (bind (Server, (sockaddr*)&ServerAddr, sizeof(ServerAddr)))
    {
        //Ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, îøèáêà
        cout << "Bind error " << WSAGetLastError() <<"\n";
        closesocket(Server); //Çàêðûâàåì ñîêåò Server
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
    }
 
    else cout << "Bind OK\n";
 
    //Çàïóñê îæèäàíèÿ ïîäêëþ÷åíèé êëèåíòà
    if (listen (Server, 1))
    {
        //Ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, îøèáêà
        cout << "Listen error " << WSAGetLastError() <<"\n";
        closesocket(Server); //Çàêðûâàåì ñîêåò Server
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
    }
 
    cout << "Waiting...\n";
 
    return 0;
}
 
//-------------------------------------------------------------------------------------
 
int Connection(void)
{
 
    sockaddr_in ClientAddr; // Àäðåñ êëèåíòà (çàïîëíÿåòñÿ ñèñòåìîé)
    int ClientAddrSize = sizeof(ClientAddr);
    
    //Ñîîáùåíèÿ ñåðâåðà
    
    struct message {
    unsigned char code;
    unsigned short length;
    struct body {
        unsigned char id;
        char *str;
        } Body; 
    } request, answer[2]; 
 
    //Îòâåò ñåðâåðà 1
    answer[0].code = 0xC0;
    answer[0].length = 0x01;
    answer[0].Body.id = 0xA2;
 
    //Ïîëå çíà÷åíèé
    char a[4] = {00000000, 00000001, 00000010, 00000100};
    answer[0].Body.str = &a[rand()%4];
 
    //Îòâåò ñåðâåðà 2
    answer[1].code = 0xC0;
    answer[1].length = 0x05;
    answer[1].Body.id = 0xA4;
 
 
    //Îòâåò ñåðâåðà 3
    answer[2].code = 0xC0;
    answer[2].length = 0x01;
    answer[2].Body.id = 0xA6;
 
    //Ïîäêëþ÷åíèå êëèåíòà ê ñîêåòó Server
 
    while(1)
    {
    Client = accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize);
    if (Client==INVALID_SOCKET)
    {
        //Äåéñòâèÿ â ñëó÷àå îøèáêè
        cout << "Accept error " << WSAGetLastError() <<"\n";
        closesocket(Server); //Çàêðûâàåì ñîêåò Server
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
    }
 
    else cout << "Accept OK\n";
 
    recv(Client, request, sizeof(request),0);
 
    if(sizeof(request) == 0) 
    {
        cout << "Error\n";
        break;
    }
 
    
    if(request.code != 0xC0) 
    {
        cout << "Error\n";
        break;
    }
 
    if (request.Body.id == 0xA1)
    {send (Client, answer[0] , sizeof(answer[0]),0);}
 
    else
 
        {if (request.Body.id == 0xA3)
        send (Client, answer[1] , sizeof(answer[1]),0);
 
            else
 
                {if (request.Body.id == 0xA5)
                send (Client, answer[2] , sizeof(answer[2]),0);
                
                else cout << "Unknown message\n";
                }
        }
    }
 
    }
 
    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
recv(Client, request, sizeof(request),0);
 
    if(sizeof(request) == 0) 
    {
        cout << "Error\n";
        break;
    }
 
    
    if(request.code != 0xC0) 
    {
        cout << "Error\n";
        break;
    }
 
    if (request.Body.id == 0xA1)
    {send (Client, answer[0] , sizeof(answer[0]),0);}
 
    else
 
        {if (request.Body.id == 0xA3)
        send (Client, answer[1] , sizeof(answer[1]),0);
 
            else
 
                {if (request.Body.id == 0xA5)
                send (Client, answer[2] , sizeof(answer[2]),0);
                
                else cout << "Unknown message\n";
                }
        }
    }
компилятор выдает следующие ошибки
1_Server.cpp
H:\U1_Server\U1_Server.cpp(165) : error C2664: 'recv' : cannot convert parameter 2 from 'struct Connection::message' to 'char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
H:\U1_Server\U1_Server.cpp(181) : error C2664: 'send' : cannot convert parameter 2 from 'struct Connection::message' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
H:\U1_Server\U1_Server.cpp(186) : error C2664: 'send' : cannot convert parameter 2 from 'struct Connection::message' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
H:\U1_Server\U1_Server.cpp(191) : error C2664: 'send' : cannot convert parameter 2 from 'struct Connection::message' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
H:\U1_Server\U1_Server.cpp(200) : error C2143: syntax error : missing ';' before 'return'
H:\U1_Server\U1_Server.cpp(201) : error C2143: syntax error : missing ';' before '}'
H:\U1_Server\U1_Server.cpp(201) : error C2143: syntax error : missing ';' before '}'
H:\U1_Server\U1_Server.cpp(201) : error C2143: syntax error : missing ';' before '}'


Ошибки, как я понимаю, вызваны тем, что структура клиентского запроса request и ответа сервера answer, который выбирается в зависимости от того, какое значение находится в поле request.Body.id, отличается от типа данных, которые передают функции recv и send.

Как это можно исправить?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
29.11.2011, 19:00
ну я так понял надо сделать преобразование (char*)request
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
29.11.2011, 21:21  [ТС]
Van111, где именно сделать преобразование?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
30.11.2011, 16:58
C++
1
recv(Client, (char*) request, sizeof(request),0);
Добавлено через 6 минут
send (Client, (char*)answer[0] , sizeof(answer[0]),0);
и т далее
P.S.и проконтролируйте чтоб sizeof(answer[0]) давал именно размер типа answer

Добавлено через 4 минуты
Цитата Сообщение от niXman Посмотреть сообщение
struct message { unsigned char id; unsigned short length; struct body { unsigned char code; char* str; }; };
а можно самому тогда генирировать ip/tcp там всё уже по умному сделанно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2011, 16:58
Помогаю со студенческими работами здесь

Клиент-Сервер отправка сообщений по udp
Здравствуйте уважаемые форумчане. Я раньше не работал с сетьями. Поэтому обращаюсь за помощью. Мне надо чтобы клиент мог отправить...

Простой клиент-сервер отправка сообщений на С++ или С#
Здравствуйте дорогие форумчане. Наверное Вас уже бесит такая тема. Я порыл много даже на этом форуме, нашел много примеров, но не смог...

как работает шифрование сообщений в клиент-сервер пиложении?
Прочитал что есть два вида шифрований : симметричные и асимметричные. Вот алгоритм обмена сообщениями взятый со страницы на хабре...

Принятие сообщений от сервера в бесконечном цикле (Клиент-Сервер Чат)
Если кто то написал сообщение то это сообщение обрабатывает сервер и рассылает всех клиентам.. Но проблема в том что не понимаю как...

Клиент-сервер: клиент требует повторно сгенерировать массив
Здравствуйте, есть программы клиент и сервер, клиент после требуемого ввода IP, пароля и генерации элементов массива всё равно требует...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru