Russian Qt Forum

Qt => Работа с сетью => Тема начата: PARTISAN от Декабрь 27, 2011, 02:20



Название: UdpSocket & SNTP протокол
Отправлено: 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;


Название: Re: UdpSocket & SNTP протокол
Отправлено: Reklats от Декабрь 28, 2011, 22:16
Советую проверить формат ответа. Возможно ответ не правильно считывается. Посмотрите побайтно что принимает сервер.


Название: Re: UdpSocket & SNTP протокол
Отправлено: PARTISAN от Декабрь 29, 2011, 04:33
Как раз-таки по поводу сообщения я не сомневаюсь ни на йоту. Там все гарантированно правильно. Прямое тому доказательство - заработавший клиент на сторонние сервера. Только это компенсировалось разрывом работы с своим сервером :( Клиент был настроен последовательностью
Код:
    timeSocket->abort();
    timeSocket->connectToHost(clientAddress, 123, QIODevice::ReadWrite);
    timeSocket->flush();
    quint64 send = timeSocket->write(sendDatagram);
Такая же последовательность на сервере почему-то не проходит, даже если читерить с хардкодным адресом клиента в connectToHost. Если как и раньше сразу биндить сервер на порт, то до клиента ответ сервера не доходит (т.е. по сути клиент стал работающим сторонним клиентом). Если использовать коннект к хосту, то не эмитится даже сигнала readyRead(). Помогите починить сервер