Russian Qt Forum

Qt => Работа с сетью => Тема начата: trenkinan от Февраль 25, 2012, 18:30



Название: сокет не принимает данные
Отправлено: 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".
Что я делаю не так, почему ничего не читается из сокета на приемнике?


Название: Re: сокет не принимает данные
Отправлено: kuzulis от Февраль 25, 2012, 18:59
Цитировать
Что я делаю не так, почему ничего не читается из сокета на приемнике?
Смотреть Qt-шные примеры и разбираться.


Название: Re: сокет не принимает данные
Отправлено: trenkinan от Февраль 25, 2012, 19:46
смотрел loopback(который 50мб перегоняет через lo), вроде все так же


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

Используй датастрим


Название: Re: сокет не принимает данные
Отправлено: trenkinan от Февраль 25, 2012, 20:29
выводит QVariant(, )


Название: Re: сокет не принимает данные
Отправлено: trenkinan от Февраль 25, 2012, 20:39
bytesAvailable(); на приемнике возвращает 0 , а write("hello") на отправителе возвращает корректное число записанных байтx


Название: Re: сокет не принимает данные
Отправлено: k0p4 от Март 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;
}


Название: Re: сокет не принимает данные
Отправлено: mutineer от Март 02, 2012, 15:03
В приемнике пишу:
Код:
 void MyServer::ReciveData()
 {
     qDebug() << "ReciveData()";
     QByteArray buf;// = new char[10];
     csocket->open(QIODevice::ReadOnly);
     buf = csocket->readAll();
     qDebug() << buf;
 }

А зачем ты тут сокет открываешь? Может лучше читать тоже через DataStream?