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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: UdpSocket & SNTP протокол  (Прочитано 3447 раз)
PARTISAN
Гость
« : Декабрь 27, 2011, 02:20 »

Суть проблемы такова. Реализованы клиент\серверные приложения SNTP протокола (используется UDP протокол с портом 123). Проблема состоит в том, что они общаются только между собой, со сторонними приложениями\серверами этого протокола - никак. Тестировал свой сервер с чужим opensource SNTP-клиентом на C# в дебаге - клиент замерзает на этапе получения ответа от сервера. Итого, имеется:
- Свой клиент-сервер общаются на ура
- Свой клиент и сторонний сервер: клиент отсылает запрос, но ответа не получает
- Сторонний клиент и свой сервер: клиент отсылает запрос, сервер его принимает и отсылает ответ, ответ до клиента не доходит
Надо настроить работу со сторонними приложениями
То что запросы\ответы в моих приложениях отправляются проверяю по возвращаемому значению метода отправки дейтаграммы - оно равно размеру дейтаграммы в байтах.
Приведу код подключения клиента и сервера (как обрабатывается сообщение думаю не важно, но если нужно - скину полный вариант)
Server:
Код:
    timeSocket = new QUdpSocket(this);
    timeSocket->bind(123, QUdpSocket::ShareAddress |  QUdpSocket::ReuseAddressHint);
    connect(timeSocket, SIGNAL(readyRead()), this, SLOT(slotAnswerOnRequest()));

//получение запроса
    do {
        datagram.resize(timeSocket->pendingDatagramSize());
        timeSocket->readDatagram(datagram.data(), datagram.size(), &clientAddress);
    } while (timeSocket->hasPendingDatagrams());
    timeSocket->connectToHost(clientAddress, 123, QIODevice::ReadWrite);
//генерация дейтаграммы-ответа и отправка клиенту
    quint64 send = timeSocket->write(sendDatagramm);
    timeSocket->disconnectFromHost();
    timeSocket->bind(123, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
Client:
Код:
    QHostAddress serverHostAddress = QHostAddress(serverAddress);
    receiveSocket = new QUdpSocket(this);
    connect(receiveSocket, SIGNAL(readyRead()), this, SLOT(slotGetAnswer()));
//генерация дейтаграммы-запроса
    QUdpSocket sendSocket;
    quint64 sendResult = sendSocket.writeDatagram(datagram, serverHostAddress, 123);
    receiveSocket->bind(123, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);

//slotGetAnswer()
    do {
        datagram.resize(receiveSocket->pendingDatagramSize());
        receiveSocket->readDatagram(datagram.data(), datagram.size());
    } while (receiveSocket->hasPendingDatagrams());
//обработка ответа
    delete receiveSocket;
Записан
Reklats
Гость
« Ответ #1 : Декабрь 28, 2011, 22:16 »

Советую проверить формат ответа. Возможно ответ не правильно считывается. Посмотрите побайтно что принимает сервер.
Записан
PARTISAN
Гость
« Ответ #2 : Декабрь 29, 2011, 04:33 »

Как раз-таки по поводу сообщения я не сомневаюсь ни на йоту. Там все гарантированно правильно. Прямое тому доказательство - заработавший клиент на сторонние сервера. Только это компенсировалось разрывом работы с своим сервером Грустный Клиент был настроен последовательностью
Код:
    timeSocket->abort();
    timeSocket->connectToHost(clientAddress, 123, QIODevice::ReadWrite);
    timeSocket->flush();
    quint64 send = timeSocket->write(sendDatagram);
Такая же последовательность на сервере почему-то не проходит, даже если читерить с хардкодным адресом клиента в connectToHost. Если как и раньше сразу биндить сервер на порт, то до клиента ответ сервера не доходит (т.е. по сути клиент стал работающим сторонним клиентом). Если использовать коннект к хосту, то не эмитится даже сигнала readyRead(). Помогите починить сервер
« Последнее редактирование: Декабрь 29, 2011, 04:38 от PARTISAN » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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