Делаю простой мессенджер на сокетах, TCP/IP. Есть клиент и сервер, дошёл до этапа обработки запросов и задумался над тем, каким образом наиболее труЪшным ооп путём организовать приём и обработку пакетов. Пакеты могут быть разные, черновой вариант такой:
enum RequestType {
Register,
Authenticate,
Message, // текстовое сообщение
Attachment, // файл
};
Пока идея такая:
- Все пакеты первым полем должны содержать
int type
- Все пакеты кроме
Attachment
вторым полем будут иметь полеunsigned size
, а далее JSON рамером вsize
с необходимыми полями -
Attachment
, в отличие от остальных, не JSON, у него три поля: комуrecipient
, имя файлаchar name[32]
и его размерunsigned size
, далее идут данные
Приём пакетов делаю так:
void Client::start()
{
char *buffer;
unsigned long bytes;
m_socket->setBlocking(false); // неблокирующий режим
while (true) {
bytes = m_socket->waitForRead();
if (bytes == 0) {
// Disconnected
delete m_socket;
return;
}
// Вот здесь нужно организовать приём и формирование пакетов
buffer = new char[bytes];
m_socket->recv(&buffer[0], bytes);
delete []buffer;
}
}
Конечно можно решить задачу «в лоб», но мне интересно:
- Как наиболее правильно с точки зрения ооп сделать задуманное? Что-то мне подсказывает для каждого пакета создать класс, которому передавать
buffer
иbytes
, который будет формировать пакет? - Какие наиболее подходящие паттерны для подобных задач?
- Где и как лучше всего осуществлять проверку аутентифицирован ли пользователь, или нет?
Может у кого есть хорошие примеры. Thanks in advance, так сказатб.