Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Простой UDP клиент-сервер, код не работает на Debian с VirtualBox 
V
    Опции темы
redrover
Дата 17.10.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не могу заставить работать широковещательное соединение между частями клиент-серверного приложения. Кажется, программа написана корректно. Прошу проверить. 
Специфика состоит в том, что запуск кода осуществляется на системах, функционирующих в виртуальных машинах VirtualBox. Причем, одна из машин принадлежит системе WinXP, а вторая MacOS X. Между ними налажена локальная сеть и пинг проходит.
Код привожу ниже.

Server
main.h
Код

#include <QApplication>

#include "weatherstation.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    WeatherStation station;
    station.show();
    return app.exec();
}

.h
Код

#ifndef WEATHERSTATION_H
#define WEATHERSTATION_H

#include <QDialog>
#include <QUdpSocket>

class QLabel;
class QLineEdit;

class WeatherStation : public QDialog
{
    Q_OBJECT

public:
    WeatherStation(QWidget *parent = 0);

private slots:
    void processPendingDatagrams();

private:
    QUdpSocket udpSocket;

    QLabel *dateLabel;
    QLabel *timeLabel;
    QLabel *temperatureLabel;
    QLabel *humidityLabel;
    QLabel *altitudeLabel;
    QLineEdit *dateLineEdit;
    QLineEdit *timeLineEdit;
    QLineEdit *temperatureLineEdit;
    QLineEdit *humidityLineEdit;
    QLineEdit *altitudeLineEdit;
};

#endif

.cpp
Код

#include <QtGui>
#include <QtNetwork>

#include "weatherstation.h"

WeatherStation::WeatherStation(QWidget *parent)
    : QDialog(parent)
{
    udpSocket.bind(QHostAddress::Any,5824);

    connect(&udpSocket, SIGNAL(readyRead()),
            this, SLOT(processPendingDatagrams()));

    dateLabel = new QLabel(tr("Date:"));
    timeLabel = new QLabel(tr("Time:"));
    temperatureLabel = new QLabel(tr("Temperature:"));
    humidityLabel = new QLabel(tr("Humidity:"));
    altitudeLabel = new QLabel(tr("Altitude:"));

    dateLineEdit = new QLineEdit;
    timeLineEdit = new QLineEdit;
    temperatureLineEdit = new QLineEdit;
    humidityLineEdit = new QLineEdit;
    altitudeLineEdit = new QLineEdit;

    dateLineEdit->setReadOnly(true);
    timeLineEdit->setReadOnly(true);
    temperatureLineEdit->setReadOnly(true);
    humidityLineEdit->setReadOnly(true);
    altitudeLineEdit->setReadOnly(true);

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(dateLabel, 0, 0);
    mainLayout->addWidget(dateLineEdit, 0, 1);
    mainLayout->addWidget(timeLabel, 1, 0);
    mainLayout->addWidget(timeLineEdit, 1, 1);
    mainLayout->addWidget(temperatureLabel, 2, 0);
    mainLayout->addWidget(temperatureLineEdit, 2, 1);
    mainLayout->addWidget(humidityLabel, 3, 0);
    mainLayout->addWidget(humidityLineEdit, 3, 1);
    mainLayout->addWidget(altitudeLabel, 4, 0);
    mainLayout->addWidget(altitudeLineEdit, 4, 1);
    setLayout(mainLayout);

    setWindowTitle(tr("Weather Station"));
}

void WeatherStation::processPendingDatagrams()
{
    QByteArray datagram;

    do {
        datagram.resize(udpSocket.pendingDatagramSize());
        udpSocket.readDatagram(datagram.data(), datagram.size());
    } while (udpSocket.hasPendingDatagrams());

    QDateTime dateTime;
    double temperature;
    double humidity;
    double altitude;

    QDataStream in(&datagram, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_4_3);
    in >> dateTime >> temperature >> humidity >> altitude;

    dateLineEdit->setText(dateTime.date().toString());
    timeLineEdit->setText(dateTime.time().toString());
    temperatureLineEdit->setText(tr("%1 C").arg(temperature));
    humidityLineEdit->setText(tr("%1%").arg(humidity));
    altitudeLineEdit->setText(tr("%1 m").arg(altitude));
}



Client
main.h
Код

#include <QApplication>

#include "weatherballoon.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    WeatherBalloon balloon;
    balloon.show();
    return app.exec();
}

.h
Код

#ifndef WEATHERBALLOON_H
#define WEATHERBALLOON_H

#include <QPushButton>
#include <QTimer>
#include <QUdpSocket>

class WeatherBalloon : public QPushButton
{
    Q_OBJECT

public:
    WeatherBalloon(QWidget *parent = 0);

    double temperature() const;
    double humidity() const;
    double altitude() const;

private slots:
    void sendDatagram();

private:
    QUdpSocket udpSocket;
    QTimer timer;
};

#endif

.cpp
Код

#include <QtCore>
#include <QtNetwork>
#include <cstdlib>

#include "weatherballoon.h"

WeatherBalloon::WeatherBalloon(QWidget *parent)
    : QPushButton(tr("Quit"), parent)
{
    connect(this, SIGNAL(clicked()), this, SLOT(close()));
    connect(&timer, SIGNAL(timeout()), this, SLOT(sendDatagram()));

    timer.start(2 * 1000);

    setWindowTitle(tr("Weather Balloon"));
}

double WeatherBalloon::temperature() const
{
    return -20.0 + (2.0 * std::rand() / (RAND_MAX + 1.0));
}

double WeatherBalloon::humidity() const
{
    return 20.0 + (2.0 * std::rand() / (RAND_MAX + 1.0));
}

double WeatherBalloon::altitude() const
{
    return 7000 + (100.0 * std::rand() / (RAND_MAX + 1.0));
}

void WeatherBalloon::sendDatagram()
{
    QByteArray datagram;
    QDataStream out(&datagram, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_3);
    out << QDateTime::currentDateTime() << temperature() << humidity()
        << altitude();

    udpSocket.writeDatagram(datagram, QHostAddress::Broadcast, 5824);//code1
}




Это сообщение отредактировал(а) redrover - 17.10.2011, 14:27
PM MAIL   Вверх
null56
Дата 17.10.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я в код не вчитывался, но хочу спросить другое...
кто отправляет broadcast и куда (ОСи какие)?
1) просто, вроде под никасами броадкасты плодить разрешено только руту, попробуй от него запустить
2) если пингуется ниск, то надо разрешить ответы на броадкасты, по умолчанию они выключены (в линух): echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts (это в линух, в маке хз как)
проверь


Это сообщение отредактировал(а) null56 - 17.10.2011, 14:54
PM MAIL   Вверх
redrover
Дата 17.10.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



null56, запустил под root. Не работает.
Кстати, запуск localhost срабатывает и без прав доступа root.

А оси Debian, но виртуализированные. 

Посмотрите код, может я что-то не так делаю?

netstat -a -p
Код

udp        0      0 *:43701                 *:*                                 706/rpc.statd   
udp        0      0 *:5824                  *:*                                 2922/weatherstation
udp        0      0 *:bootpc                *:*                                 2841/dhclient   
udp        0      0 *:mdns                  *:*                                 1064/avahi-daemon: 
udp        0      0 *:sunrpc                *:*                                 694/portmap     
udp        0      0 *:882                   *:*                                 706/rpc.statd   
udp        0      0 *:ipp                   *:*                                 1261/cupsd      
udp        0      0 *:40601                 *:*                                 1064/avahi-daemon: 
udp        0      0 *:58150                 *:*                                 2920/weatherballoon
udp6       0      0 [::]:mdns               [::]:*                              1064/avahi-daemon: 
udp6       0      0 [::]:36972              [::]:*                              1064/avahi-daemon: 



Это сообщение отредактировал(а) redrover - 17.10.2011, 15:43
PM MAIL   Вверх
null56
Дата 17.10.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а вообще броадкасты между вм идут? ты пробовал разослать?

Добавлено через 3 минуты и 28 секунд
ты по аналогии с примером из ассистента делал?
PM MAIL   Вверх
redrover
Дата 17.10.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Похоже не идут совсем. А как удостовериться?
Пример брал из книги.

Это сообщение отредактировал(а) redrover - 17.10.2011, 16:28
PM MAIL   Вверх
null56
Дата 17.10.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(redrover @  17.10.2011,  16:27 Найти цитируемый пост)
Похоже не идут совсем. А как удостовериться?

должен приходить ответ на рассылающую машину от получающей машины

проверь, еще раз говорю, на обоих машинах
cat > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
PM MAIL   Вверх
redrover
Дата 17.10.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



0 - если ответ запрещен?
Установил программы на чистые Debian машины. Та же проблема. Правил файл, который вы указали. Не помогло.

Это сообщение отредактировал(а) redrover - 17.10.2011, 18:17
PM MAIL   Вверх
null56
Дата 18.10.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что у тебя показывает вывод
cat > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 
cat > /proc/sys/net/ipv4/icmp_echo_ignore_all
от рута пускаешь?

а ты снифером глянь интерфейсы принимаемые, есть там чо на входе/на выходе (tcpdupm, wireshark)
PM MAIL   Вверх
redrover
Дата 18.10.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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