Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45

С++: Передача класса на сервер и обратно

26.08.2019, 11:02. Показов 3196. Ответов 27

Студворк — интернет-сервис помощи студентам
Здравствуйте, возник вопрос при изучении WINSOCK, возможно ли передать целый класс через функцию send или как то еще, пожалуйста помогите, информации вообще нигде нет об этом.

Например у меня есть класс персонажа, в нем я загружаю его характеристики и модельку с анимациями и тд, я хочу сделать онлайн игру, что бы ко мне могли присоединиться еще люди, так как мне это сделать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.08.2019, 11:02
Ответы с готовыми решениями:

Передача данных с клиента на сервер и обратно
Доброго времени суток. Вопрос состоит в следующем у меня в приложении есть регистрация. Поля для ввода (E-mail,Password, Repeat Password,...

ftp server, передача файла с клиента на сервер и обратно
Появилась задача передавай файлы с клиента на сервер и обратно Для начала надо реализовать в одну сторону, например передача файла с...

Передача массива класса на вторую форму и обратно
Помогите пожалуйста. Задача такая , на первой форме нужно сделать только создания массива класса Group и кнопка перехода на 2 форму. А на...

27
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 15:43
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kiraProfit Посмотреть сообщение
свяжемся может все таки )))
Вынеси данные, которые тебе необходимо отправлять на сервер в отдельную структуру
C++
1
2
3
4
5
6
7
8
9
10
#pragma pack(push, 1)
struct PlayerData
{
    char name[64];
    float x, y, w, h, vx, vy, speed = 0;
    int dir = 0; int HowMuchStones = 0;
    int hp;
    bool life;
};
#pragma pack(pop)
Добавлено через 1 минуту
На клиенте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Player 
: public PlayerData
{
public:
    Image img;
    Texture texture;
    Sprite sprite;
..............
};
 
Player bob;
send(sock, (PlayerData *)&bob, sizeof(PlayerData));
Добавлено через 1 минуту
На сервере
C++
1
2
PlayerData bob;
recv(sock, &bob, sizeof(PlayerData));
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 17:45  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вынеси данные, которые тебе необходимо отправлять на сервер в отдельную структуру
то есть мне это написать на стороне сервера:
C++
1
2
3
4
5
6
7
8
9
10
#pragma pack(push, 1)
struct PlayerData
{
    char name[64];
    float x, y, w, h, vx, vy, speed = 0;
    int dir = 0; int HowMuchStones = 0;
    int hp;
    bool life;
};
#pragma pack(pop)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 17:59
kiraProfit, вроде дошло, что у тебя не получается
Тебе нужно сделать для каждого игрока уникальный идентификатор, возможно это будет имя.
На клиенте хранится не переменная типа Player, а список (вернее std::map) объектов Player
C++
1
std::map<std::string, Player> players;
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 18:01  [ТС]
мне просто
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
std::map<std::string, Player> players;
добавить в код ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 18:03
Когда с сервера приходит сообщение - делаешь (для класса Player нужно сделать конструктор Player(const PlayerData &data));
C++
1
2
3
4
5
6
PlayerData data;
recv(sock, &bob, sizeof(PlayerData));
 
auto it = players.find(data.name);
if (it == players.end())
   it = players.emplace(data.name, data);
Добавлено через 58 секунд
отрисовка -
C++
1
2
for (auto &item: players)
    window.draw(item)
Добавлено через 53 секунды
На сервере делаешь
C++
1
std::map<std::string, PlayerData> players;
Дальше по-аналогии
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 18:04  [ТС]
то есть менять в моем первоначальном классе ничего не надо ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 18:05
Цитата Сообщение от kiraProfit Посмотреть сообщение
то есть менять в моем первоначальном классе ничего не надо ?
Нет, не надо (ну, кроме PlayerData, как я показывал)
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 21:04  [ТС]
погоди, а
C++
1
2
3
4
5
6
PlayerData data;
recv(sock, &bob, sizeof(PlayerData));
 
auto it = players.find(data.name);
if (it == players.end())
   it = players.emplace(data.name, data);
делать когда принимаю на стороне клиента ?

Добавлено через 2 часа 51 минуту
тогда откуда берется bob если строка std::map<std::string, Player> players;

Добавлено через 3 минуты
Клиент:

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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#include <SFML/Graphics.hpp>
#include "map.h"
#include "view.h"
#include <iostream>
#include <sstream>
#include <winsock2.h>
#include <string>
 
#pragma warning(disable: 4996);
#pragma comment(lib, "ws2_32.lib")
 
SOCKET Connection;
using namespace sf;
using namespace std;
 
float frame = 0;
 
#pragma pack(push, 1)
struct PlayerData
{
    float x, y, w, h, vx, vy, speed = 0;
    int dir = 0; int HowMuchStones = 0;
    int hp;
    bool life;
    String name;
};
#pragma pack(pop)
 
class Player: public PlayerData {
public:
    Image img;
    Texture texture;
    Sprite sprite;
    Player(int X, int Y, int W, int H, String NAME, String PlayerName) {
        x = X; y = Y; w = W; h = H; hp = 100; life = true;
        name = NAME;
        Text text;
        text.setString(PlayerName);
        img.loadFromFile("img/" + name);
        texture.loadFromImage(img);
        sprite.setTexture(texture);
        sprite.setTextureRect(IntRect(0,0,w,h));
        sprite.setPosition(x,y);
    }
 
    void update(float time) {
            
        switch (dir) {
        case 0: vx = -speed, vy = 0; break;
        case 1: vx = speed, vy = 0; break;
        case 2: vx = 0, vy = -speed; break;
        case 3: vx = 0, vy = speed; break;
        }
 
        x += vx * time;
        y += vy * time;
        speed = 0;
        sprite.setPosition(x,y);
        interactionWithMap();
        if (hp <= 0) life = false;
 
    }
 
    float getPlayerCoordinateX() {
        return x;
    }
    float getPlayerCoordinateY() {
        return y;
    }
 
    void interactionWithMap() {
        for (int i = y / 32; i < (y + h) / 32; i++)
            for (int j = x / 32; j < (x + w) / 32; j++) {
                if (TileMap[i][j] == '0') {
                    if (vy > 0) {
                        y = i * 32 - h;
                    }
                    if (vy < 0) {
                        y = i * 32 + 32;
                    }
                    if (vx > 0) {
                        x = j * 32 - w;
                    }
                    if (vx < 0) {
                        x = j * 32 + 32;
                    }
                }
 
                if (TileMap[i][j] == 's') {
                    hp -= 20;
                    TileMap[i][j] = ' ';
                }
 
            }
    }
 
};
 
class enemy {
 
};
 
Player bob(200, 200, 60, 60, "enemy.png", "Kira");
map<string, PlayerData> bob;
 
void ClientHandler() {
    while(true) {
 
    recv(Connection, (char*)(&bob), sizeof(bob), NULL);
    }
}
 
int main()
 
{
 
    
 
    
 
    RenderWindow window(VideoMode(1600, 900), "Game");
 
 
    
 
    view.reset(FloatRect(0,0,800,600)); 
 
    Font font;
    font.loadFromFile("CyrilicOld.ttf");
    Text text("", font, 20);
    text.setFillColor(Color::White);
    text.setStyle(Text::Bold);
    
 
    Image map_image;//объект изображения для карты
    map_image.loadFromFile("img/map.png");//загружаем файл для карты
    Texture map;//текстура карты
    map.loadFromImage(map_image);//заряжаем текстуру картинкой
    Sprite s_map;//создаём спрайт для карты
    s_map.setTexture(map);//заливаем текстуру спрайтом
 
 
 
    Clock clock;
 
    //WSAStartup
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, &wsaData) != 0) {
        cout << "ERROR" << endl;
        exit(1);
    }
 
    // string ip;
    // cout << "Введите IP: ";
    // cin >> ip;
 
    SOCKADDR_IN addr;
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("25.104.48.77");
    addr.sin_port = htons(1111);
    addr.sin_family = AF_INET;
 
    Connection = socket(AF_INET, SOCK_STREAM, NULL);
    if (connect(Connection, (SOCKADDR*)&addr, sizeof(addr)) != 0) {
        cout << "ERROR\n";
        return 1;
    }
 
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler, NULL, NULL, NULL);
 
    while (window.isOpen())
 
    {
        
        while (true) {
        
 
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
 
        time = time / 1000;
 
        Event event;
 
        while (window.pollEvent(event))
 
        {
 
            if (event.type == Event::Closed)
 
                window.close();
 
        }
 
        if(bob.life) {
 
        if (Keyboard::isKeyPressed(Keyboard::A)) {
            bob.dir = 0; bob.speed = 0.15;
            frame += 0.015 * time;
            if (frame > 8) frame -= 8;
            bob.sprite.setTextureRect(IntRect(65 * int(frame) + 60, 60, -60, 60));
        }
        if (Keyboard::isKeyPressed(Keyboard::D)) {
            bob.dir = 1; bob.speed = 0.15;
            frame += 0.015 * time;
            if (frame > 8) frame -= 8;
            bob.sprite.setTextureRect(IntRect(65 * int(frame), 60, 60, 60));
        }   
        if (Keyboard::isKeyPressed(Keyboard::W)) {
            bob.dir = 2; bob.speed = 0.15;
            frame += 0.015 * time;
            if (frame > 8) frame -= 8;
            bob.sprite.setTextureRect(IntRect(65 * int(frame), 130, 60, 60));
        }
        if (Keyboard::isKeyPressed(Keyboard::S)) {
            bob.dir = 3; bob.speed = 0.15;
            frame += 0.015 * time;
            if (frame > 8) frame -= 8;
            bob.sprite.setTextureRect(IntRect(65 * int(frame), 0, 60, 60));
        }
        if (Keyboard::isKeyPressed(Keyboard::Enter)) {
            frame += 0.01 * time;
            if (frame > 3) frame -= 3;
            bob.sprite.setTextureRect(IntRect(129 * int(frame), 260, 60, 60));
        }
        }
        getPlayerCoordinateForView(bob.getPlayerCoordinateX(), bob.getPlayerCoordinateY());
 
        bob.update(time);
 
        window.setView(view);
        
        window.clear();
        /////////////////////////////Рисуем карту/////////////////////
        for (int i = 0; i < HEIGHT_MAP; i++)
            for (int j = 0; j < WIDTH_MAP; j++)
            {
                if (TileMap[i][j] == ' ')  s_map.setTextureRect(IntRect(0, 0, 32, 32)); //если встретили символ пробел, то рисуем 1й квадратик
                if (TileMap[i][j] == 's')  s_map.setTextureRect(IntRect(32, 0, 32, 32));//если встретили символ s, то рисуем 2й квадратик
                if ((TileMap[i][j] == '0')) s_map.setTextureRect(IntRect(64, 0, 32, 32));//если встретили символ 0, то рисуем 3й квадратик
 
 
                s_map.setPosition(j * 32, i * 32);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадрат
 
                window.draw(s_map);//рисуем квадратики на экран
            }
 
 
        std::ostringstream HP;
        HP << bob.hp;
 
        
 
        text.setString("HP:" + HP.str());
        text.setPosition(view.getCenter().x + 100, view.getCenter().y + 200);
 
        window.draw(bob.sprite);
 
        window.draw(text);
 
        window.display();
 
        
            send(Connection, (char *)&bob, sizeof(bob), NULL);
        }
 
        
 
    }
 
    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
#include <iostream>
#include <SFML/Graphics.hpp>
#include <sstream>
#include <winsock2.h>
 
#pragma comment(lib, "ws2_32.lib")
 
#pragma warning(disable: 4996);
 
using namespace std;
using namespace sf;
 
 
 
SOCKET Connections[100];
 
int Counter = 0;
void ClientHandler(int index) {
    char buf[256];
    while (true) {
        recv(Connections[index], (char*)(&buf), sizeof(buf), 0);
        for (int i = 0; i < Counter; i++) {
            if (i == index) {
                continue;
            }
            send(Connections[i], (char*)(&buf), sizeof(buf), 0);
        }
    }
}
 
int main() {
    //WSAStartup
    WSAData wsaData;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, &wsaData) != 0) {
        cout << "ERROR" << endl;
        exit(1);
    }
 
    SOCKADDR_IN addr;
    int sizeofaddr = sizeof(addr);
    addr.sin_addr.s_addr = inet_addr("25.104.48.77");
    addr.sin_port = htons(1111);
    addr.sin_family = AF_INET;
 
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL);
    bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    listen(sListen, SOMAXCONN);
 
    SOCKET newConnection;
    for (int i = 0; i < 100; i++) {
        newConnection = accept(sListen, (SOCKADDR*)&addr, &sizeofaddr);
 
        if (newConnection == 0) {
            cout << "ERROR\n";
        }
        else {
            cout << "New Client Connected\n";
 
            Connections[i] = newConnection;
            Counter++;
 
            CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler, (LPVOID)(i), NULL, NULL);
        }
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2019, 21:04
Помогаю со студенческими работами здесь

Передача данных на сервер в формате xml или json и обратно
Привет всем! Я начинающий программист и делаю свой интернет-магазин, но на сколько мне известно во многих интернет-магазинах данных о...

Передача параметров из html в js и обратно
&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;javascript параметры&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form name=&quot;data&quot;&gt; Введите...

Передача параметров в поток и обратно
Есть поток (модуль потока Unit2.cpp) //--------------------------------------------------------------------------- #include...

Передача переменной из си в асм и обратно
Не подскажите ли вы как передать переменную(и массив переменных) из кода си во вставку асм и обратно, если можно, приведите пример...

Отправка Json на сервер и обратно
Собственно сел учить Json и мне понравился вот такой способ работы с AJAX Json, работает он идеально. Подскажите пожалуйста на ваш...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru