Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> пакетный протокол для мессенджера, вопрос по реализации) 
V
    Опции темы
dgolukas
Дата 4.1.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



пишу инстант-мессенджер простенький, 
ну там прием отправка сообщений,пока без файлов, смайлов и всяких статусов.
и вот встала задача написать протокол. 
решила реализовать его в виде двух классов данные и сам протокол у которого будет как бы хиддер и тело, состоящее из объекта класса Data
застряла на методе createPacket, прям ступор... т.е. лучше енум этот привести в свитче в самом методе или???
и вот еще статические поля можно же только в статических методах вызывать, как бы мне тогда ID пакета запихнуть в криейт.
вобщем требуются как воздух ваши идеи и советы, а я уж их как-нибудь пропишу.
и вот еще один вопрос, а в этом протоколе реально ли с обычными данными работать или их надо как-то в бинарном виде???
айнидхелп.

з.ы. в идеале, ну по кр мере как я представляю себе все это дело, у меня будет еще класс отдельный обработчик событий, класс обработчик сообщений который будет использовать протокол, ну и классы ресиверы и сендеры.
Код

#include "Socket.h"
#include "Data.h"

//#include <stdlib>
#include <iostream>
#include <string>

#ifndef PACKET_H
#define PACKET_H

class Packet
{
    int _packetsize;
    static int _packetID;
    Data data;
    int type;
    enum PACKET_TYPES
    {STATE_PACKET=0,REGISTR_PACKET,LOGIN_PACKET,LOGOUT_PACKET,SENDMESS_PACK,DELUSR_PACKET,ADDUSR_PACKET};
  protected:
    static int getPacketID(){return _packetID;}
  public:
    Packet();
    ~Packet(){};
    void createPacket();
    //void deletePacket();
    Packet& getPacket() {return *this;};
    int getSizePacket();  
};

#endif

int Packet::getSizePacket()
{
  _packetsize=+data.getDatasize();
  return _packetsize;
}  

void Packet::createPacket()
{
  _packetsize=_packetsize.getSizePacket();
  
  switch()
}


Код

#ifndef DATA_H
#define DATA_H

class Data
{
    enum DATA_TYPES {STRING,INT};
    int _datasize;
    static int _toUID;
    static int _fromUID;
  protected:
    static int getToUID();
    static int getFromUID();
  public:
    Data(){};
    ~Data(){};
    //void sendData();
    void getData();
    inline int getDatasize() {return _datasize;}    
}
#endif

PM MAIL   Вверх
andrew_121
Дата 4.1.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



что-то вы слишком увлеклись статическими свойствами классов.

Цитата(dgolukas @  4.1.2010,  00:24 Найти цитируемый пост)
static int _packetID;

допустим, создан один объект класса Packet. все созданные объекты после него, будут содержать свойство _packetID равное значению первому. если конечно в конструкторе что-то не изменяет его.

Цитата(dgolukas @  4.1.2010,  00:24 Найти цитируемый пост)
 enum PACKET_TYPES
    {STATE_PACKET=0,REGISTR_PACKET,LOGIN_PACKET,LOGOUT_PACKET,SENDMESS_PACK,DELUSR_PACKET,ADDUSR_PACKET};

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

и статиков поменьше)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 4.1.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 4.1.2010,  00:34)
что-то вы слишком увлеклись статическими свойствами классов.

Цитата(dgolukas @  4.1.2010,  00:24 Найти цитируемый пост)
 enum PACKET_TYPES
    {STATE_PACKET=0,REGISTR_PACKET,LOGIN_PACKET,LOGOUT_PACKET,SENDMESS_PACK,DELUSR_PACKET,ADDUSR_PACKET};

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

и статиков поменьше)

да, со статикой я и правда увлеклась.
я вообще долго понять не могла как это писать.хотела сделать счетчик, ну чтобы у каждого пакета был свой номер. 
а по поводу перечислений, т.е. мне проще завести класс или структуру, где прописать все возможные типы пакетов и методы работы с ними?
потом связать классы и передавать просто в методы?


з.ы. статика в классе Data,это я думала,что будув хиддер данных передавать из класса user idы отправителя и получателя
это разве можно как-то иначе реализовать??

Это сообщение отредактировал(а) dgolukas - 4.1.2010, 00:47
PM MAIL   Вверх
andrew_121
Дата 4.1.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(dgolukas @  4.1.2010,  00:42 Найти цитируемый пост)
т.е. мне проще завести класс или структуру, где прописать все возможные типы пакетов и методы работы с ними?

да, можно и так. там же пропишите енумы. почитайте паттерн Абстрактная фабрика

Добавлено через 2 минуты и 24 секунды
пример на С++ довольно подробно демонстрирует реализацию.

Это сообщение отредактировал(а) andrew_121 - 4.1.2010, 00:58


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 4.1.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



ооо! спасибо огромное! )
PM MAIL   Вверх
dgolukas
  Дата 4.1.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



от что теперь получилось на выходе (почти на выходе)
осталось разобраться как работает map.
вопрос не по STL, а скорее правильно ли я идею написания подхватила?
и чем можно заменить собственно использование map'a ???
так  лучше  или совсем бред???

Код

#include "PacketHeader.h"
#include "PacketData.h"

#ifndef _PACKET_FACTORY_H_
#define _PACKET_FACTORY_H_

class PacketFactory
{
    static int _packetCounter;
    unsigned int _packetID;
  public:
    PacketFactory()
    {
      _packetCounter+=_packetCounter;
            this->_packetID = _packetCounter;
    }
    //virtual ~PacketFactory(){};
    virtual void createPacket(PacketHeader&,PacketData&)=0;
    virtual PacketFactory& getPacket()=0;
    virtual int getSizePacket()=0;
    int getPacketID(){ return _packetID;}
};  
    
#endif


Код
#include "PacketFactory.h"
#include "PacketHeader.h"
#include "PacketData.h"

#include <iostream>
#include <string>
#include <map>

#ifndef _PACKET_H_
#define _PACKET_H_

class Packet:public PacketFactory
{
    int size;
    std::string data;    
    unsigned int _packetID;
  public:
    Packet();
    void createPacket(PacketHeader&,PacketData&);
    Packet& getPacket(){return *this;}
    int getSizePacket();
    int getPacketID(){ return _packetID;}  
    typedef std::map<PacketHeader,PacketData> IdMapType;
    IdMapType idMap;    
};

#endif
---packet.cpp

#include "Packet.h"

#include <map>
#include <string>
#include <iostream>

Packet::Packet():PacketFactory()
{
  /*idMap[Packet::PacketCreate] = Packet<PacketCreate>;*/
}

Packet& createPacket(PacketHeader &ph, PacketData &pd)
{
  size=ph.size;
  data=pd.getData();

  map<ph.type,pd.str>::iterator mapping = idMap.find(this->_packetID);

 return mapping->second();
}
 
 int Packet::getSizePacket(PacketHeader &ph)
 {
   int temp=ph.getSize();
   return temp;
 }

Код
#include <iostream>
#include <string>

#ifndef _PACKET_TYPE_H
#define _PACKET_TYPE_H

struct PacketType
{
  enum _types
     {STATE_PACKET=0,REGISTR_PACKET,LOGIN_PACKET,LOGOUT_PACKET,SENDMESS_PACKET,DELUSR_PACKET,ADDUSR_PACKET} type;
  int getPacketType();
};

int PacketType::getPacketType()
{
  switch(type)
  {
    case STATE_PACKET:   
         return 0; break;
    case REGISTR_PACKET: 
         return 1; break;
    case LOGIN_PACKET: 
         return 2; break;
    case LOGOUT_PACKET:
         return 3; break;
    case SENDMESS_PACKET: 
         return 4; break;
    case DELUSR_PACKET: 
         return 5; break;
    case ADDUSR_PACKET:  
         return 6; break;
    default: return -1; break;
  }
}

#endif

Код
#include <string>

#ifndef _PACKET_DATA_H
#define _PACKET_DATA_H

class PacketData
{
    int size;
    std::string str;
  public:
    std::string getData(){return str;}
    int getPacketSize(){return size;}
};
    
#endif

Код
#include <iostream>

#include "PacketType.h"
#include "PacketData.h"

#ifndef _PACKET_HEADER_H
#define _PACKET_HEADER_H

class PacketHeader
{
    int type;
    int size;
  public:
    PacketHeader()
    {
      type=0;
      size=0;
    }
    PacketHeader& getType(PacketType&);
    PacketHeader& getSize(PacketData&);
};

#endif

---packetheader.cpp
#include "PacketHeader.h"

PacketHeader& PacketHeader::getType(PacketType &pt)
{
    type=pt.getPacketType(); 
    return *this;
}

PacketHeader& PacketHeader::getSize(PacketData &pd)
{
  size=pd.getPacketSize();
  return *this;
}

PM MAIL   Вверх
andrew_121
Дата 4.1.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(dgolukas @  4.1.2010,  20:06 Найти цитируемый пост)
#ifndef _PACKET_FACTORY_H_
#define _PACKET_FACTORY_H_

стражи нужно ставить до инклюдов.


Цитата(dgolukas @  4.1.2010,  20:06 Найти цитируемый пост)
вопрос не по STL, а скорее правильно ли я идею написания подхватила?

это скажи, правильно ли код работает. лень все читать. букав много.


Цитата(dgolukas @  4.1.2010,  20:06 Найти цитируемый пост)
Packet& createPacket(PacketHeader &ph, PacketData &pd)

принадлежность не указана.




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 4.1.2010, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 4.1.2010,  21:28)
стражи нужно ставить до инклюдов.

это скажи, правильно ли код работает. лень все читать. букав много.


Цитата(dgolukas @  4.1.2010,  20:06 Найти цитируемый пост)
Packet& createPacket(PacketHeader &ph, PacketData &pd)

принадлежность не указана.


1) да по стражам исправлю. спасибо
2) код не работает в реализации Packet  как-то с map кучу ошибок выдает. мне кажется его лучше чем-нить заменить.
3) спасибо, исправила. проглядела.
PM MAIL   Вверх
andrew_121
Дата 4.1.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(dgolukas @  4.1.2010,  21:35 Найти цитируемый пост)
как-то с map кучу ошибок выдает

Мне догадаться? ;)


Цитата(dgolukas @  4.1.2010,  21:35 Найти цитируемый пост)
мне кажется его лучше чем-нить заменить.

если у тебя появляются ошибки, это не значит что его нужно чем-то заменять. согласись, полезнее будет понять в чем суть ошибок.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 4.1.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 4.1.2010,  21:41)
Цитата(dgolukas @  4.1.2010,  21:35 Найти цитируемый пост)
как-то с map кучу ошибок выдает

Мне догадаться? ;)


Packet.h:19: error: conflicting return type specified for ‘virtual Packet& Packet::createPacket(PacketHeader&, PacketData&)’
PacketFactory.h:18: error:   overriding ‘virtual void PacketFactory::createPacket(PacketHeader&, PacketData&)’
Packet.cpp: In constructor ‘Packet::Packet()’:
Packet.cpp:9: error: ‘PacketCreate’ is not a member of ‘Packet’
Packet.cpp:9: error: ‘Packet’ is not a template
Packet.cpp:9: error: ‘PacketCreate’ was not declared in this scope
Packet.cpp:9: error: expected primary-expression before ‘;’ token
PacketHeader.h: In member function ‘virtual Packet& Packet::createPacket(PacketHeader&, PacketData&)’:
PacketHeader.h:13: error: ‘int PacketHeader::size’ is private
Packet.cpp:14: error: within this context
Packet.cpp:17: error: ‘map’ was not declared in this scope
PacketHeader.h:12: error: ‘int PacketHeader::type’ is private
Packet.cpp:17: error: within this context
PacketData.h:9: error: ‘std::string PacketData::str’ is private
Packet.cpp:17: error: within this context
Packet.cpp:17: error: ‘::iterator’ has not been declared
Packet.cpp:17: error: expected ‘;’ before ‘mapping’
Packet.cpp:19: error: ‘mapping’ was not declared in this scope

 smile  smile  smile 
PM MAIL   Вверх
andrew_121
Дата 4.1.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



положи весь проект в архив. если не секретный, конечно smile


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 4.1.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 4.1.2010,  22:28)
положи весь проект в архив. если не секретный, конечно smile

не секретный)
завтра с родительского компа заархивирую, у меня на линуксе только Ark, который почему-то только открывает архивы)
спсб!!!
PM MAIL   Вверх
dgolukas
Дата 9.1.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 4.1.2010,  22:28)
положи весь проект в архив. если не секретный, конечно smile

сорре, что пропала.пришлось срочно уехать
вобщм я все переделала без фабрики 
и просто конструктор класса протокол принимает на вход указатель на экземпляр класса хиддер и на экземпляр класса дата.
ну и все)
все работает вобщм.
спасибо за помощь!!!
 smile 
PM MAIL   Вверх
NYX
Дата 16.1.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



А кампот?smile .... тоесть итоговый код smile Интересноже smile

Это сообщение отредактировал(а) NYX - 16.1.2010, 10:36
--------------------
'long long long' is too long for GC
PM   Вверх
dgolukas
  Дата 16.1.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



компот))
ну вот пакет хидер
Код

#ifndef _PACKET_HEADER_H
#define _PACKET_HEADER_H

#include <iostream>
enum PacketType
     {STATE_PACKET=0,REGISTR_PACKET=1,LOGIN_PACKET=2,LOGOUT_PACKET,SENDMESS_PACKET,DELUSR_PACKET,ADDUSR_PACKET,PROFILE};

class PacketHeader
{
  protected:
    PacketType _type;
    int _size;
  public:
    PacketHeader()
    {
     // _type=0;
      _size=0;
    }
    PacketHeader(PacketType pt, int size);
    
    PacketType getType();
    int getSize();
};

#endif


и сам пакет)

Код

#ifndef _PACKET_H_
#define _PACKET_H_

#include "PacketHeader.h"
//#include "PacketData.h"

#include <sstream>
#include <iostream> 
#include <ios>

class Packet
{
      PacketHeader *_head;
     std::string _data;
     friend std::ostream& operator<<(std::ostream&, const Packet&);
     friend std::istream& operator>>(std::istream&, Packet&);
  public:
    Packet();
    Packet(PacketHeader *header, char* data);
    //Packet(PacketHeader *_ph, PacketData *_pd);
    ~Packet();
    
    PacketHeader* getPacketHeader();
        
    std::ostringstream* createOutputStream() {
    return new std::ostringstream(_data, std::ios::binary);
    }
    
    std::istringstream* createInputStream() {
    return new std::istringstream(_data, std::ios::binary);
    }

 };

#endif

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0800 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.