crossplatform.ru

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


  Ответ в Сокеты передача прием
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
evCo Дата 13.7.2008, 16:05
  Проблему решил методом тыка :)

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, 15:30
  Вообщем вылазят какие-то ошибки ("Обнаружена ошибка отправить отчет...") при работе с сокетами.

Если ничего не передавать ошибок нет. Пакеты упаковываю так:
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();


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

Скажите мож я с памятью чето напутал?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 20:42