crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 17:49