Qt: работа с сетью, UDP протокол

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Qt: работа с сетью, UDP протокол

Сообщение IMB »

Доброго дня!
Пишу клиента для общения с серверов с использованием UDP протокола.
h

Код: Выделить всё

#include <QMainWindow>
#include <QStringList>
#include <QtNetwork/QUdpSocket>

#define DEFAULT_SERVER_PORT 12200
#define DEFAULT_MIN_PORT    1025
................
private:
    QString server_address;
    qint16 server_port;
    bool is_connected;
    QUdpSocket *socket;

cpp

Код: Выделить всё

server_address = ui->server_address->text().trimmed();
server_port = ui->server_port->text().trimmed().toInt();

if (is_connected) {
...........................
    socket->disconnectFromHost();
} else {
    if (server_port >= DEFAULT_MIN_PORT && server_address.length() > 0) {
        socket->connectToHost(server_address, server_port,
                  QIODevice::ReadWrite);
........................
        is_connected = true;
    }
}

Проблема в том, что каждый раз при вызове фукции connectToHost программа завершается с SIGSEGV.
Почему вызов connectToHost приводит к таким последствиям?
Спасибо.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: работа с сетью, UDP протокол

Сообщение NickLion »

Не вижу вызова bind - сначала нужно связать с каким-то портом, с которого будет идти отправка пакетов. Ну, и чисто имхо, UDP всё же connection-less, connectToHost несколько искажает понимание что происходит, нужно понимать, что всё, что посылается во write может не дойти.
Спасибо сказали:
Аватара пользователя
Aviator
Сообщения: 65
ОС: Debian GNU/Linux amd64

Re: Qt: работа с сетью, UDP протокол

Сообщение Aviator »

В конструкторе:

Код: Выделить всё

socket = new QUdpSocket(this);

В деструкторе:

Код: Выделить всё

delete socket;

Пример передачи датаграммы с интерфейса с адресом client_interface_address:client_port на server_address:server_port:

Код: Выделить всё

socket->bind(QHostAddress(client_interface_address), client_port);
socket->writeDatagram(buffer, buffer_size, QHostAddress(server_address), server_port);
С уважением, Сергей.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: работа с сетью, UDP протокол

Сообщение IMB »

Требования bind является требованием Qt, скажем в C вызов bind на клиенте не требуется?
Как я могу гарантировать, что выбранный порт окажется свободен на клиенте, даже если я выберу достаточно большой номер?

По поводу ненадёжности UDP знаю - таковы требования.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5409
ОС: Gentoo

Re: Qt: работа с сетью, UDP протокол

Сообщение /dev/random »

С одной стороны, в Qt bind() можно вызывать без параметров, чтобы привязать к "любому адресу и порту".
С другой стороны, SIGSEGV - достаточно необычная реакция на отсутствие bind(), даже для Qt. Я сильно сомневаюсь, что проблема в этом. Проверьте, наверное, указатель socket. Не NULL ли там, или не мусор ли какой-нибудь?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: работа с сетью, UDP протокол

Сообщение IMB »

Спасибо всем, похоже я забыл создать экземпляр класса :blush:
Спасибо сказали: