Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UDP Echo Server 
V
    Опции темы
Ober
Дата 12.11.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Подскажите пожалуйста,что я делаю не так. Уже пол дня сижу и не могу ничего сделать. Мне нужно чтобы сервер получая любое сообщение(которое он даже не будет обрабатывать) генерировал случайное чило и возвращал его клиенту. Но у меня получается что соощение от клиента серверу не доходит, а обрабатывается в самом клиенте. Примеров по UDP я не нашел по этому лепил с документации.
Вот код:
Server:



main
Код

#include <QtGui/QApplication>
#include "udpserver.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    UDPServer w;
    w.show();

    return a.exec();
}


.h
Код

#ifndef UDPSERVER_H
#define UDPSERVER_H

#include <QLabel>

class QUdpSocket;

class UDPServer : public QWidget
{
    Q_OBJECT

public:
    UDPServer(QWidget *parent = 0);

public slots:
    void answer();

private:
    QUdpSocket *udpSocket;
};

#endif // UDPSERVER_H


.cpp
Код

#include "udpserver.h"
#include <ctime>
#include <QtNetwork>

UDPServer::UDPServer(QWidget *parent)
    : QWidget(parent)
{
    srand(time(0));

    QLabel *lbl = new QLabel("<h1>Server is started</h1>", this);
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(45454, QUdpSocket::ShareAddress);

    connect( udpSocket, SIGNAL(readyRead()), this, SLOT(answer()));
}

void UDPServer::answer()
{
    QByteArray datagram = "The server generate a random number, it is :"
                          + QByteArray::number( rand() % 100 );
    udpSocket->writeDatagram( datagram.data(), datagram.size(),
                              QHostAddress::Broadcast, 45454);
}


Client:

main
Код

#include <QtGui>
#include "UDPClient.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    UDPClient w;
    w.show();
    return a.exec();
}


.h
Код

#include <QtGui>
#include <QUdpSocket>

class UDPClient : public QWidget
{
    Q_OBJECT

public:
    UDPClient(QWidget *parent = 0);

public slots:
    void slotSendToServer();
    /*void fromServer();*/

private:
    QTextEdit *p_txtInfo;
    QUdpSocket *udpSocket;
};

#endif // WIDGET_H


.cpp
Код

#include "UDPClient.h"
#include <QtNetwork>

UDPClient::UDPClient(QWidget *parent)
    : QWidget(parent)
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(45454, QUdpSocket::ShareAddress );
    
    p_txtInfo = new QTextEdit;

    p_txtInfo->setReadOnly( true );

    QPushButton *pcmd = new QPushButton("Request to server");

    QVBoxLayout *pvbxLayout = new QVBoxLayout;
    pvbxLayout->addWidget(new QLabel("<h1>Client</h1>"));
    pvbxLayout->addWidget(p_txtInfo);
    pvbxLayout->addWidget( pcmd );
    setLayout( pvbxLayout );

    connect(pcmd, SIGNAL(clicked()), SLOT(slotSendToServer()));
    connect( udpSocket, SIGNAL(readyRead()), this, SLOT(fromServer()));
}

void UDPClient::slotSendToServer()
{
    QByteArray datagram( "message" );
    udpSocket->writeDatagram( datagram.data(), datagram.size(),
                      QHostAddress::Broadcast, 45454);
}

void UDPClient::fromServer()
{
  while( udpSocket->hasPendingDatagrams())
  {
    QByteArray datagram;
    datagram.resize( udpSocket->pendingDatagramSize());
    udpSocket->readDatagram( datagram.data(), datagram.size());
    p_txtInfo->append(tr("Recieved: \"%1\"").arg( datagram.data()));
  }
}

PM MAIL   Вверх
Ober
Дата 12.11.2012, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Частично я уже решил. Получается я передаю серверу сообщение через один сокет, а сообщение клиенту от сервера через другой, но теперь возникла другая проблема, сигнал readyRead() от клиента сервер получает всего один раз, а потом почему- то не получает. Посмотрите пожалуйста, я скину два .cpp все остальные без изменения:

Сервер:

Код

#include "udpserver.h"
#include <ctime>
#include <QtNetwork>
#include <QMessageBox>

UDPServer::UDPServer(QWidget *parent)
    : QWidget(parent)
{
    srand(time(0));
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(1234, QUdpSocket::ShareAddress);
    
    lbl = new QLabel("<h1>Server is started</h1>", this);
    /[color=red]/Этот сигнал не вызывается больше одного раза :((
    connect( udpSocket, SIGNAL(readyRead()), this, SLOT(processingDatagram()));[/color]
}

void UDPServer::processingDatagram()
{
   QMessageBox::information(0, "aaa", "AA");
   udpSocket2 = new QUdpSocket(this);
   QByteArray datagram;
   QString arg = QString("%1").arg(rand() % 100);
   datagram.append( arg );

   udpSocket2->writeDatagram( datagram.data(), datagram.size(),
                             QHostAddress::Broadcast, 12345);
}


Клиент:
Код

#include "UDPClient.h"
#include <QtNetwork>
#include <ctime>
UDPClient::UDPClient(QWidget *parent)
    : QWidget(parent)
{
    udpSocket = new QUdpSocket(this);
    udpSocket2 = new QUdpSocket(this);
    udpSocket2->bind(12345, QUdpSocket::ShareAddress);
    srand(time(0));
    p_txtInfo = new QTextEdit;
    p_txtInfo->setReadOnly( true );

    QPushButton *pcmd = new QPushButton("Request to server");

    QVBoxLayout *pvbxLayout = new QVBoxLayout;
    pvbxLayout->addWidget(new QLabel("<h1>Client</h1>"));
    pvbxLayout->addWidget(p_txtInfo);
    pvbxLayout->addWidget( pcmd );
    setLayout( pvbxLayout );

    connect(pcmd, SIGNAL(clicked()), SLOT(slotSendToServer()));
    connect( udpSocket2, SIGNAL(readyRead()), this, SLOT(fromServer()));
}


Я думаю, что это может быть из за того что, в слоте
Код

slotSendTo Server()

в сокет записывается одинаковый объект QByteArray, но я пробовал передавать в него различные сообщения, в том числе и рендомные, никакого эффекта. Может где-то нужно очистить поток.

Это сообщение отредактировал(а) Ober - 12.11.2012, 19:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.