crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Сокеты передача прием, Проблемы с памятью при создании пакетов
evCo
  опции профиля:
сообщение 13.7.2008, 15:30
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 19
Регистрация: 12.7.2008
Пользователь №: 233

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вообщем вылазят какие-то ошибки ("Обнаружена ошибка отправить отчет...") при работе с сокетами.

Если ничего не передавать ошибок нет. Пакеты упаковываю так:
bool SendPakToServer(QString msg){
    QByteArray ba_data("");
    ba_data.append(msg);
    unsigned int data_size_int = ba_data.length();
    char *ba =  ba_data.data();
    char *data = new char(data_size_int + 8);
    memcpy(data, &data_size_int, 4);
    memcpy(data + 4, ba, data_size_int);
    csocket->write(QByteArray::fromRawData(data, data_size_int + 4));
    delete []data; delete []ba;
    return true;
}

Тоесть первые 4 байта отвожу под размер пакета, а потом сам пакет. Вроде как теоретически я все оформил правильно.

Прием и расшифровка вот такая:
void DataRecive(){
    QByteArray incoming = chache_incoming + csocket->readAll();
    char *data = incoming.data();
    qint64 data_size = incoming.length();
    bool readed = true;
    while(readed && data_size) {
        readed = false;
        if(data_size > 4) {
            unsigned int size = 0;
            memcpy(&size, data, 4);
            if(data_size >= size + 4){
                data_size -= size + 4;
                DecodePak(incoming.mid(4, size));
                if(data_size > 0) {
                    incoming = incoming.mid(size + 4, data_size);
                    data = new char(incoming.length());
                    data = incoming.data();
                    readed = true;
                } else break;
            }
        }
    }
    delete []data;
    if(data_size > 0) {
        chache_incoming = incoming.mid(0, data_size);
    } else chache_incoming = "";
}

Разрезаю пакеты. И если остаеться кусочек сохраняю его в chache_incoming, а потом приклеиваю в начало.

Но вообще ошибки вылетают при передачи одного пакета от клиента серверу и одного от сервера клиенту. Клиент шлет логин пароль, сервер отвечает, что логин не правильный. Клиент рвет соединение.

После не долгого дебага выяснил, что ошибка вылетает иногда тут:
csocket->write(QByteArray::fromRawData(data, data_size_int + 4));

иногда при разрыве соединения:
csocket->disconnectFromHost();


Проблемы почему-то возникают на клиенте намного чаше чем на сервере, хотя сервер тоже парой вылетает с тем же "отчетом".

Скажите мож я с памятью чето напутал?

Сообщение отредактировал evCo - 13.7.2008, 15:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
evCo
  опции профиля:
сообщение 13.7.2008, 16:05
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 19
Регистрация: 12.7.2008
Пользователь №: 233

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проблему решил методом тыка :)

bool SendPakToServer(QString msg){
    QByteArray ba_data(""); ba_data.append(msg);
    unsigned int data_size_int = ba_data.size();
    char *data = new char(4);
    memcpy(data, &data_size_int, 4);
    csocket->write(data, 4);
    csocket->write(ba_data.data(), ba_data.size());
    delete []data;
    return true;
}


Сообщение отредактировал evCo - 13.7.2008, 17:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.6.2019, 9:44