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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QT 3.3] Не получается работа с QSocketNotifer и QSocketDevice  (Прочитано 12314 раз)
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
« Последнее редактирование: Апрель 15, 2008, 12:27 от Viliam_Volos_V » Записан
Sergeich
Гость
« Ответ #1 : Апрель 17, 2008, 02:48 »

попробуй создать socketDevice не в стеке, а в куче: socketDevice( new QSocketDevice(QSocketDevice::Datagram) )
Записан
Alex03
Гость
« Ответ #2 : Апрель 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.

Записан
Viliam_Volos_V
Гость
« Ответ #3 : Апрель 17, 2008, 10:11 »

да нет я под никсами пишу.
такое ошушение что слот dataresive почемуто зацикливается когда второй раз принимает сообщение.Выважу QMessageBox при 2-ом принятии сообшения он выводит его 200 с гаком раз и виснет.
не пойму в чём дело
Записан
Viliam_Volos_V
Гость
« Ответ #4 : Апрель 17, 2008, 15:47 »

QSocketDevice::readBlock: Device is not open

выдаёт в консоле когда зависает
Записан
Viliam_Volos_V
Гость
« Ответ #5 : Апрель 17, 2008, 17:00 »

может кто работал с UDP
Скинте мне плиз простой пример как принимать текс передающийся по UDP протоколу
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Апрель 17, 2008, 19:00 »

могу скинуть примеры из книжки Бланшет и Саммерфилд, один пример прием по UDP, второй - передача, я сам не работал с сетевыми протоколами, так что большего сказать не могу.
Записан

Юра.
Viliam_Volos_V
Гость
« Ответ #7 : Апрель 18, 2008, 10:06 »

спасибо но у меня эти примеры уже есть
Записан
Sergeich
Гость
« Ответ #8 : Апрель 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 );
Записан
Viliam_Volos_V
Гость
« Ответ #9 : Апрель 18, 2008, 12:08 »

MAX_LEN - откуда берёш ?
Записан
Viliam_Volos_V
Гость
« Ответ #10 : Апрель 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()));
}

Записан
Viliam_Volos_V
Гость
« Ответ #11 : Апрель 19, 2008, 11:18 »

Так - с UDP разобрались
Почитав асистанс узнал что QSocketDevice можно использовать и для TCP протокола
Создав класс QSocketDevice::Stream
Только вот проблема в том что нигде не нашёл как реализвать соеденение сервера и клиента используя этот класс
Кто работал - подскажите
Записан
Sergeich
Гость
« Ответ #12 : Апрель 20, 2008, 10:54 »

Что значит реализовать соединение? С клиентской стороны юзается QSocketDevice::connect, с серверной юзается конструктор QSocketDevice::QSocketDevice ( int socket,  QSocketDevice::Stream )
Записан
Alex03
Гость
« Ответ #13 : Апрель 21, 2008, 06:57 »

Так - с UDP разобрались
Почитав асистанс узнал что QSocketDevice можно использовать и для TCP протокола
Создав класс QSocketDevice::Stream
Только вот проблема в том что нигде не нашёл как реализвать соеденение сервера и клиента используя этот класс
Кто работал - подскажите
А чем QSocket не нравится то?
Записан
Viliam_Volos_V
Гость
« Ответ #14 : Апрель 21, 2008, 10:31 »

Подумав - решил сделать на QSocket  - всё заработало
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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