Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
#1

Сеть и очередь структур - C++

03.09.2010, 03:07. Просмотров 468. Ответов 3
Метки нет (Все метки)

Всем привет.

Пишу клиент-серверное приложение, в качестве пакета данных у меня 4 int числа, в виде структуры.

C++
1
2
3
4
struct message
{
    int arg[4];
};
Клиентская программа параллельным потоком принимает данные от сервера, каждая "порция" данных это одна структура message.

Получив данные от сервера и преобразовав их в int числа я делаю из них массив и ставлю в очередь.
C++
1
2
3
4
5
6
7
8
9
10
ProcessMessage(int arg0, int arg1, int arg2, int arg3)
{
    message newmessage;
    newmessage.arg[0] = arg0;
    newmessage.arg[1] = arg1;
    newmessage.arg[2] = arg2;
    newmessage.arg[3] = arg3;
 
    commands.push(newmessage);
}
Где commands - это очередь сообщений. Объявлена так:
C++
1
queue<message> commands;
А дальше я делаю вот такую вещь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Gameplay::ProcessMessages()
{
    while (!Net.commands.empty())
    {
        message rmessage;
        rmessage = Net.commands.front();
        if(rmessage.arg[0] == 0 && rmessage.arg[1] == 2)
        {
            Player.SetTarget(rmessage.arg[2], rmessage.arg[3]);
        }
        Net.commands.pop();
        rmessage.arg;
    }
}
Gameplay - мой корневой класс, внутри которого я все объявляю.
Net - класс для работы с сетью, очередь commands явзяется членом этого класса.
Player::SetTarget - это метод для перемещения персонажа (эта команда должна выплняться с данными полученными от сервера)

Собственно проблема в том, что данные, приходящие в метод Player::SetTarget не те. Единственное что знаю наверняка, так это то, что в функцию ProcessMessage от сервера поступают корректтные аргументы. А уже на стороне клиента я делаю с ними что-то не то.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2010, 03:07     Сеть и очередь структур
Посмотрите здесь:

Как представиь очередь, состоящую из структур, на статическом массиве? - C++
из условия задачи: Разработать программу, реализующую алгоритм очереди (20 элементов). Задача решается в двух вариантах: статическом (на...

C++ занесение структур находящихся в разных потоках, в общую очередь - C++
Весь код приводить не стал, надеюсь идея будет понятна. Я циклом создал потоки а теперь, нужно структуры (Clien), которые в этих потоках...

Очередь (сделать очередь, чтобы добавляло, удаляло, читало. Не STL.) - C++
Помогите пожалуйста написать очередь. Есть Температура double и ее тип int ну и нужно сделать очередь, чтобы добавляло, удаляло, читало....

Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете - C++
Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете. В каждый момент времени происходит одно из событий:...

Задача на очередь (вывод сообщения, что очередь пуста) - C++
Доброго дня! Есть задачка на очередь, которая работает нормально, только надо добавить код, чтобы выводил сообщение, что очередь пуста.....

Массив структур, сохранение начала каждой из структур - C++
Я создал такую структуру class Lancuch { public: char cos; Lancuch * nastepny; }; Lancuch * poczatek=NULL; cin &gt;&gt;...

Создать очередь. Добавить элемент в очередь. Удалить элемент из очереди - C++
Нужно создать очередь. Добавить элемент в очередь. Удалить элемент из очереди. Вот моё &quot;творение&quot;. int main() { int...

Очередь - C++
Доброй ночи!Написала программу, но почему то print и contains не работает! помогите, пожалуйста, разобраться или наведите на путь...

Очередь - C++
Реализуйте структуру данных &quot;очередь&quot; на основе циклического массива или другим способом. Входные данные В каждой строке входных...

Очередь? What - C++
Всем доброго время суток.Дело в том, что с трудом дается с++, но очень хочется стать программистом.Вообщем ничего толком не объяснив препод...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.09.2010, 04:30     Сеть и очередь структур #2
очень информативно
показывай код отправки/приема. и еще как пакуешь/распаковываешь структуру.

зы
наверняка юзаешь сокеты?
на boost.asio такое дело пишется за пять минут. и работает естественно лучше

Добавлено через 42 секунды
вру. не за пять минут. за 20
Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
03.09.2010, 21:03  [ТС]     Сеть и очередь структур #3
Сервер:
Это в бесконечном цикле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        for (int i = (int)List.size()-1; i >= 0; i--)
        if (FD_ISSET(List[i].sc, &readset))
        {
                if (recv(List[i].sc, buf, 16, 0) > 0) //!
                {
                    clients++;
                    int com[4];
                    memcpy(com,buf,4*sizeof(int));
                    if(com[1] == -1)
                        com[1] = i;
                    ProcessMessage(i, com[0], com[1], com[2], com[3]);
                    SendMessage(i, com[0], com[1], com[2], com[3]);
                }
                else
                {
                    closesocket(List[i].sc);
                    List.erase(List.begin()+i);
                };  
        };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void SendMessage(int client_id, int arg0, int arg1, int arg2, int arg3)
{
    int arg[4];
 
    arg[0] = arg0;
    arg[1] = arg1;
    arg[2] = arg2;
    arg[3] = arg3;
 
    char sbuf[4];
    memcpy(sbuf,arg,4*sizeof(int));
    send(List[client_id].sc, sbuf, 16, 0);
}
C++
1
2
3
4
5
6
7
8
9
10
11
void ProcessMessage(int client_id, int arg0, int arg1, int arg2, int arg3)
{
    if(arg0 == -1)
        arg0 = client_id;
 
    if(arg1 == 2)
    {
        cout << "Received: " << arg0 << " " << arg1 << " " << arg2 << " " << arg3 << "\n";
        SendMessage(client_id, arg0, arg1, arg2, arg3);
    }
}

Клиент:
Бесконечный цикл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void L_Net::NetMain()
{
    while (1)
    {
        if (recv(Sock, buf, 16, 0) > 0)
        {
            int rcom[4];
            memcpy(rcom,buf,4*sizeof(int));
            ProcessMessage(rcom[0], rcom[1], rcom[2], rcom[3]);
        }
    };
    closesocket (Sock);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void L_Net::ProcessMessage(int arg0, int arg1, int arg2, int arg3)
{
    message newmessage;
    newmessage.arg[0] = arg0;
    newmessage.arg[1] = arg1;
    newmessage.arg[2] = arg2;
    newmessage.arg[3] = arg3;
 
    commands.push(newmessage);
    client_id = arg0;
    lasttx = arg2;
    lastty = arg3;
}
Про boost.asio насылшан... это С++ библиотека? Использование сторонних библиотек меня останавливает по двум причинам:

1 - не хочется использовать код, который не понимаю
2 - боюсь падения производительности, т.к. чужой код мне как-то сложнее понимать, а следовательно неясно, что оптимизировать.

Что по этим пунктам можно сказать о boost.asio?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.09.2010, 21:27     Сеть и очередь структур #4
кто такой buf в первом фрагменте?

Цитата Сообщение от Tilk Посмотреть сообщение
char sbuf[4];
тут у нас 4 байта.
Цитата Сообщение от Tilk Посмотреть сообщение
memcpy(sbuf,arg,4*sizeof(int));
а тут ты пытаешься в него впихнуть 16

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

Цитата Сообщение от Tilk Посмотреть сообщение
2 - боюсь падения производительности
boost.asio считается эталоном для сетевого/конкурентного программирования. так что об этом переживать не стОит.
Yandex
Объявления
03.09.2010, 21:27     Сеть и очередь структур
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru