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

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

26.08.2019, 11:02. Показов 3190. Ответов 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, 11:14
Цитата Сообщение от kiraProfit Посмотреть сообщение
Здравствуйте, возник вопрос при изучении WINSOCK, возможно ли передать целый класс через функцию send или как то еще, пожалуйста помогите, информации вообще нигде нет об этом.
В общем случае - нельзя. Надо преобразовать объект этого класса в массив байтов, передать его, и на другом конце сделать из этого массива объект класса.

Можно только если твой класс представляет из себя POD-стркутуру
C++
1
2
3
4
5
6
7
8
9
struct SSSS
{
    int id;
    char name[128];
    uint8_t img[2048];
};
 
SSSS obj;
send(sock, &obj, sizeof(obj));
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
26.08.2019, 12:20
Сереализуешь, передаёшь, десериализуешь, польза.
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:04  [ТС]
У меня получилось сделать, но не так как я предполагал, запустил на разных компьютерах, когда на одном из них двигаю персонажа, он двигается и на другом, получается что для каждого клиента нужно создавать новый класс ??? Если да как это сделать ?

Добавлено через 1 минуту
oleg-m1973, У меня получилось сделать, но не так как я предполагал, запустил на разных компьютерах, когда на одном из них двигаю персонажа, он двигается и на другом, получается что для каждого клиента нужно создавать новый класс ??? Если да как это сделать ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 13:06
Цитата Сообщение от kiraProfit Посмотреть сообщение
oleg-m1973, У меня получилось сделать, но не так как я предполагал, запустил на разных компьютерах, когда на одном из них двигаю персонажа, он двигается и на другом, получается что для каждого клиента нужно создавать новый класс ??? Если да как это сделать ?
В смысле? Другой комп получает не то, что ты отправляешь или что?
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:08  [ТС]
нет, другой комп получает координаты те же что и на другом компьютере, тем самым у меня присутствует 1 модель персонажа и те же самые изменяющиеся координаты...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 13:13
Цитата Сообщение от kiraProfit Посмотреть сообщение
нет, другой комп получает координаты те же что и на другом компьютере, тем самым у меня присутствует 1 модель персонажа и те же самые изменяющиеся координаты...
Не передавай эти координаты и всё. Или не обрабатывай на другом компе переданные .
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:15  [ТС]
но а как же, как мне сделать что бы при добавлении на сервер еще 1 клиента создавалась еще 1 модель персонажа?
и что бы не было затруднения с еще последующими такими же подключениями...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 13:19
Цитата Сообщение от kiraProfit Посмотреть сообщение
но а как же, как мне сделать что бы при добавлении на сервер еще 1 клиента создавалась еще 1 модель персонажа?
и что бы не было затруднения с еще последующими такими же подключениями...
При подключении у тебя создаётся новый коннект. Для него и создавай персонажа.
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:22  [ТС]
но новый коннект у меня создается на стороне сервера уже, то есть там и создавать нового персонажа, например на клиенте у меня:
Player bob(x,y);
а на сервере:
Player bob2(x,y)
??
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 13:25
Цитата Сообщение от kiraProfit Посмотреть сообщение
но новый коннект у меня создается на стороне сервера уже, то есть там и создавать нового персонажа, например на клиенте у меня:
Типа того. Можно даже просто bob.
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:33  [ТС]
А нужно ли на стороне сервера создавать такой же класс Player как и у клиента, например на клиенте у меня такой класс:

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
class Player {
public:
    float x, y, w, h, vx, vy, speed = 0;
    int dir = 0; int HowMuchStones = 0;
    int hp;
    bool life;
    String name;
    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] = ' ';
                }
 
            }
    }
 
};
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 13:37
Цитата Сообщение от kiraProfit Посмотреть сообщение
А нужно ли на стороне сервера создавать такой же класс Player как и у клиента, например на клиенте у меня такой класс:
Не обязательно, скорее даже не нужно.
На сервере тебе нужны только те данные, которые ты будешь передавать другим игрокам, ну и методы соответствующие.
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:46  [ТС]
не совсем понимаю, можете пожалуйста подсказать в дискорде или где-нибудь еще ?
Просто включу демонстрацию экрана вы посмотрите и скажете что так а что не так
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 13:56
Цитата Сообщение от kiraProfit Посмотреть сообщение
не совсем понимаю,
Ты передаёшь с клиента на сервер и обратно не классы и объекты, а какие-то данные, информацию в каком-то формате - бинарном ли текстовом ли, неважно. Серверу совсем не нужно хранить эту информацию в том же виде, как на клиенте - у них разные задачи: у клиента - нарисовать картинку, у сервера - синхронизировать данные между игроками.

Например, серверу необязателько хранить картинки и тестуры - зачем их гонять по сети?
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 13:58  [ТС]
я понял что ты имеешь в виду, но как это реализовать, я вчера начал учить winsocket-ы и буквально в этом месяце c++ вообще
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 14:06
Цитата Сообщение от kiraProfit Посмотреть сообщение
я понял что ты имеешь в виду, но как это реализовать, я вчера начал учить winsocket-ы и буквально в этом месяце c++ вообще
Здесь я бы сделал сообщения - строки, заканчивающиеся нулём, состоящие из пар атрибут=значение, например
"id=Player1;action=move;x=100;y=200;spee d=2;"
Что означает - игрок Palyer1 передвигается на позицию {100, 200} со скоростью 2

Или "id=Player1;action=die;" - Player1 умер
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 14:11  [ТС]
сейчас еще больше не понял xD

Добавлено через 3 минуты
принятие данных у меня такое:

C++
1
2
3
4
5
6
7
Player bob;
 
void ClientHandler() {
    while(true) {
    recv(Connection, (char*)(&bob), sizeof(bob), NULL);
    }
}
но без класса у меня естественно ошибка, а когда делаю такой же класс, класс требует что бы были сразу введены данные в Player bob(....);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2019, 15:16
Цитата Сообщение от kiraProfit Посмотреть сообщение
принятие данных у меня такое:
У тебя в классе Player присутсвуют Image, Texture, Sprite... - их нужно передавать на каждое событие? Я так думаю - нет.

И кстати, что это за классы и что за String?
0
-10 / 0 / 0
Регистрация: 08.02.2017
Сообщений: 45
26.08.2019, 15:25  [ТС]
свяжемся может все таки )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2019, 15:25
Помогаю со студенческими работами здесь

Передача данных на сервер в формате 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, работает он идеально. Подскажите пожалуйста на ваш...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru