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

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

19.11.2011, 16:31. Показов 1608. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru