Russian Qt Forum

Qt => Работа с сетью => Тема начата: Viliam_Volos_V от Апрель 15, 2008, 12:14



Название: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 15, 2008, 12:14
Делаю прогу которая весит на порту и просто принимает остылаемый текст по UDP

странно что первый раз текст принимается - а второй раз нет

не пойму в чём проблема


listener.cpp
Код:
#include <qvariant.h>
#include <qtextedit.h>
#include <qlayout.h>
#include "listener.h"

listener::listener(QWidget *parent, const char *name)
    : QDialog(parent, name), socketDevice(QSocketDevice::Datagram)
{
     socketDevice.setBlocking(false);
     socketDevice.bind(QHostAddress("192.168.1.1"), 9090);
     socketNotifier = new QSocketNotifier(socketDevice.socket(),QSocketNotifier::Read,this);
     connect(socketNotifier, SIGNAL(activated(int)),this, SLOT(dataReceived()));
 
     setCaption("Listener");
     textedit1 = new QTextEdit(this);
     QHBoxLayout *mainLayout = new QHBoxLayout(this);
     mainLayout->setMargin(11);
     mainLayout->setSpacing(6);
     mainLayout->addWidget(textedit1);
}


void listener::dataReceived()
{

  textedit1->setText("");
  char *data2;
  QByteArray datagram(socketDevice.bytesAvailable());
  socketDevice.readBlock(data2, datagram.size());
  textedit1->setText(data2);
}

listener.h

Код:

#ifndef LISTENER_H
#define LISTENER_H
#include <qdialog.h>
#include <qsocketdevice.h>
#include <qsocketnotifier.h>

class QTextEdit;

class listener : public QDialog
{
     Q_OBJECT
public:
     listener(QWidget *parent = 0, const char *name = 0);
signals:


private slots:

       void dataReceived();

private:
     QSocketDevice socketDevice;
     QSocketNotifier *socketNotifier;
     QTextEdit *textedit1;

};

#endif


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Sergeich от Апрель 17, 2008, 02:48
попробуй создать socketDevice не в стеке, а в куче: socketDevice( new QSocketDevice(QSocketDevice::Datagram) )


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Alex03 от Апрель 17, 2008, 07:23
попробуй создать socketDevice не в стеке, а в куче: socketDevice( new QSocketDevice(QSocketDevice::Datagram) )
Так он там итак не на стеке, а в самом объекте диалога... (может конечно и на стеке вместе с диалогом но это не критично)
Если под виндой то может это мешает:
Цитировать
Q_LONG QSocketDevice::bytesAvailable () const
Returns the number of bytes available for reading, or -1 if an error occurred.

Warning: On Microsoft Windows, we use the ioctlsocket() function to determine the number of bytes queued on the socket. According to Microsoft (KB Q125486), ioctlsocket() sometimes returns an incorrect number. The only safe way to determine the amount of data on the socket is to read it using readBlock(). QSocket has workarounds to deal with this problem.



Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 17, 2008, 10:11
да нет я под никсами пишу.
такое ошушение что слот dataresive почемуто зацикливается когда второй раз принимает сообщение.Выважу QMessageBox при 2-ом принятии сообшения он выводит его 200 с гаком раз и виснет.
не пойму в чём дело


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 17, 2008, 15:47
QSocketDevice::readBlock: Device is not open

выдаёт в консоле когда зависает


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 17, 2008, 17:00
может кто работал с UDP
Скинте мне плиз простой пример как принимать текс передающийся по UDP протоколу


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: lit-uriy от Апрель 17, 2008, 19:00
могу скинуть примеры из книжки Бланшет и Саммерфилд, один пример прием по UDP, второй - передача, я сам не работал с сетевыми протоколами, так что большего сказать не могу.


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 18, 2008, 10:06
спасибо но у меня эти примеры уже есть


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Sergeich от Апрель 18, 2008, 10:37
Я принимал так:
Код:
	char data[MAX_LEN];
int len = sock->readBlock( data, MAX_LEN-1 );
if ( len <= 0 ) return;
data[len] = 0;
QString message( data );


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 18, 2008, 12:08
MAX_LEN - откуда берёш ?


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 18, 2008, 13:07
Спасибо всем - Всё заработало
Даю код кому интересно
дакже клму интересно могут критиковать - буду только благодарен


main.cpp

Код:
#include <qapplication.h>
#include "listener.h"
#include <qtextcodec.h>

 int main(int argc, char *argv[])
{
     QApplication app(argc, argv);
     QTextCodec::setCodecForCStrings( QTextCodec::codecForName("UTF8"));
     QTextCodec::setCodecForTr( QTextCodec::codecForName("UTF8"));
     QTextCodec::setCodecForLocale( QTextCodec::codecForName("UTF8"));

     listener list1;
     list1.ip="192.168.1.1";
     list1.port=9090;
list1.on();
     app.setMainWidget(&list1);
     list1.show();
     return app.exec();
}

Listener.h

Код:
#ifndef LISTENER_H 
#define LISTENER_H
#include <qdialog.h>
#include <qsocketdevice.h>
#include <qsocketnotifier.h>
#include <qstring.h>

class QTextEdit;

class listener : public QDialog
{
     Q_OBJECT
public:
     listener(QWidget *parent = 0, const char *name = 0);
     QString ip,text; int port;
void on();
signals:


private slots:

       void dataReceived();

private:
     QSocketDevice socketDevice;
     QSocketNotifier *socketNotifier;
     QTextEdit *textedit1;

};

#endif

Listener.cpp

Код:
#include <qvariant.h>
#include <qtextedit.h>
#include <qlayout.h>
#include <qstring.h>

#include "listener.h"

listener::listener(QWidget *parent, const char *name)
    : QDialog(parent, name), socketDevice(QSocketDevice::Datagram)
{
//   ip="192.168.1.1";
//    port=9090;
     setCaption("Listener");
     textedit1 = new QTextEdit(this);
     QHBoxLayout *mainLayout = new QHBoxLayout(this);
     mainLayout->setMargin(11);
     mainLayout->setSpacing(6);
     mainLayout->addWidget(textedit1);
}


void listener::dataReceived()
{
int MAX_LEN = 255;
char data[MAX_LEN];
int len = socketDevice.readBlock( data, MAX_LEN-1 );
if ( len <= 0 ) return;
data[len] = 0;
text = data;
textedit1->append(data);
}

void listener::on()
{
     socketDevice.setBlocking(true);
     socketDevice.bind(QHostAddress(ip), port);
     socketNotifier = new QSocketNotifier(socketDevice.socket(),QSocketNotifier::Read,this);
connect(socketNotifier, SIGNAL(activated(int)),this, SLOT(dataReceived()));
}



Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 19, 2008, 11:18
Так - с UDP разобрались
Почитав асистанс узнал что QSocketDevice можно использовать и для TCP протокола
Создав класс QSocketDevice::Stream
Только вот проблема в том что нигде не нашёл как реализвать соеденение сервера и клиента используя этот класс
Кто работал - подскажите


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Sergeich от Апрель 20, 2008, 10:54
Что значит реализовать соединение? С клиентской стороны юзается QSocketDevice::connect, с серверной юзается конструктор QSocketDevice::QSocketDevice ( int socket,  QSocketDevice::Stream )


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Alex03 от Апрель 21, 2008, 06:57
Так - с UDP разобрались
Почитав асистанс узнал что QSocketDevice можно использовать и для TCP протокола
Создав класс QSocketDevice::Stream
Только вот проблема в том что нигде не нашёл как реализвать соеденение сервера и клиента используя этот класс
Кто работал - подскажите
А чем QSocket не нравится то?


Название: Re: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice
Отправлено: Viliam_Volos_V от Апрель 21, 2008, 10:31
Подумав - решил сделать на QSocket  - всё заработало