Суть проблемы такова. Реализованы клиент\серверные приложения 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;