Russian Qt Forum
Ноябрь 01, 2024, 07:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: сокет не принимает данные  (Прочитано 4360 раз)
trenkinan
Гость
« : Февраль 25, 2012, 18:30 »

Хочу переслать строку "hello" по сети
В отправителе пишу
Код:
void Connection::SendData()
{
    qDebug() << "in senddata() : " << mysocket->state();
    mysocket->open(QIODevice::ReadWrite);
    int written = mysocket->write(QByteArray("hello"));
    qDebug() << written;           ;
}
этот слот вызывается, когда уже произошло подключение.
Вывод:
Код:
in senddata() :  QAbstractSocket::ConnectedState 
5

В приемнике пишу:
Код:
 void MyServer::ReciveData()
 {
     qDebug() << "ReciveData()";
     QByteArray buf;// = new char[10];
     csocket->open(QIODevice::ReadOnly);
     buf = csocket->readAll();
     qDebug() << buf;
 }
Это тоже сигнал
Вывод:
Код:
ReciveData() 
""
Смотрел wireshark-ом, пакеты уходят(вроде), делал фильтр по порту и нашел в одном из пакетов "hello".
Что я делаю не так, почему ничего не читается из сокета на приемнике?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Февраль 25, 2012, 18:59 »

Цитировать
Что я делаю не так, почему ничего не читается из сокета на приемнике?
Смотреть Qt-шные примеры и разбираться.
Записан

ArchLinux x86_64 / Win10 64 bit
trenkinan
Гость
« Ответ #2 : Февраль 25, 2012, 19:46 »

смотрел loopback(который 50мб перегоняет через lo), вроде все так же
Записан
lolbla2
Гость
« Ответ #3 : Февраль 25, 2012, 20:11 »

смотрел loopback(который 50мб перегоняет через lo), вроде все так же

Используй датастрим
Записан
trenkinan
Гость
« Ответ #4 : Февраль 25, 2012, 20:29 »

выводит QVariant(, )
Записан
trenkinan
Гость
« Ответ #5 : Февраль 25, 2012, 20:39 »

bytesAvailable(); на приемнике возвращает 0 , а write("hello") на отправителе возвращает корректное число записанных байтx
Записан
k0p4
Гость
« Ответ #6 : Март 02, 2012, 14:42 »

1. Отправляешь данные в коннекшене void Connection::SendData(), а принимаешь в сервере void MyServer::ReciveData(). Сервер принимает только подключение. Т.е. соккет. Соккет должен принимать и отправлять данные. Никак не сервер.
2. Как-то странно ты пишешь\читаешь данные.
Код:
void TcpSocket::readyRead()
{
    QDataStream in(this);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (bytesAvailable() < blockSize)
        return;

    qint8 someCommand;
    in >> someCommand;

    switch(someCommand){
    case COMMAND_FIRST:
         in >> someData;
         break;
    case COMMAND_SECOND:
         in >> someElseData;
         break;
    default:
          qDebug() << "no such command in protocol";
    }
    sendAnswer();

    return;
}

void TcpSocket::sendAnswer()
{
    blockSize = 0;

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);

    out << (quint16)0;
    out << Command();

    switch(Command()){
    ... // обрабатываешь в соответсвии с текущей командой.
    }
    write(block);
    return;
}
« Последнее редактирование: Март 02, 2012, 14:49 от k0p4 » Записан
mutineer
Гость
« Ответ #7 : Март 02, 2012, 15:03 »

В приемнике пишу:
Код:
 void MyServer::ReciveData()
 {
     qDebug() << "ReciveData()";
     QByteArray buf;// = new char[10];
     csocket->open(QIODevice::ReadOnly);
     buf = csocket->readAll();
     qDebug() << buf;
 }

А зачем ты тут сокет открываешь? Может лучше читать тоже через DataStream?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.