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

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

Восстановить пароль Регистрация
 
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
03.09.2010, 03:07     Сеть и очередь структур #1
Всем привет.

Пишу клиент-серверное приложение, в качестве пакета данных у меня 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 от сервера поступают корректтные аргументы. А уже на стороне клиента я делаю с ними что-то не то.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.09.2010, 04:30     Сеть и очередь структур #2
очень информативно
показывай код отправки/приема. и еще как пакуешь/распаковываешь структуру.

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

Добавлено через 42 секунды
вру. не за пять минут. за 20
Tilk
 Аватар для 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++
 Аватар для niXman
3133 / 1445 / 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     Сеть и очередь структур
Ответ Создать тему
Опции темы

Текущее время: 09:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru