Russian Qt Forum

Qt => Работа с сетью => Тема начата: st.paul89 от Апрель 04, 2010, 18:47



Название: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: st.paul89 от Апрель 04, 2010, 18:47
Всем доброго времени суток.
Суть проблемы в следующем - нужно написать приложение, которое бы принимало с определенного порта все сообщения от сервера и отсылал их ему обратно. Можно ли реализовать такое дело, если адрес отсылающего не известен заранее, то есть нужно из пришедшей дейтаграммы выдернуть ип отсылающего. Если нет, то как реализовать такое приложение, если считать что адресс отправителя известен.

P.S. C Qt работаю уже несколько лет, но с сетью работать не приходилось, а програмка нужна достаточно сильно, поэтому прошу помощи.

Всем заранее спасибо за ответы!


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: SimpleSunny от Апрель 04, 2010, 18:58
Используй QTcpSocket или QUdpSocket.

Пример взят из Assistant. Самый простой случай.

Код
C++ (Qt)
void Server::initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::Any, 7755);
 
    connect(udpSocket, SIGNAL(readyRead()),
            this, SLOT(readPendingDatagrams()));
}
 
void Server::readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;
 
        udpSocket->readDatagram(datagram.data(), datagram.size(),
                                &sender, &senderPort);
 
        udpSocket->writeDatagram(datagram, sender, senderPort);
    }
}


Название: Re: Приложение, получающее собщения, и отправ
Отправлено: st.paul89 от Апрель 04, 2010, 19:18
Тогда еще такой вопрос. Дейтаграмма пришла, у неё есть TTL (Time to Live) Его наверное необходимо нарастить, иначе сообщение просто "сдохнет" не добравшись до сервера. Не подскажите как это реализовать?
И еще судя по Assistant'у у QTcpSocket нет функций ReadDatagram и WriteDatagram.
По идее меня не интересует транспортный уровень, то есть мне нужно отсылать обратно и tcp и udp пакеты.


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: SimpleSunny от Апрель 04, 2010, 19:25
Не надо увеличивать TTL. Так как dg (datagram) добралась до сервера, ибо мы её уже обрабатываем :) А в ответ мы будем посылать уже новые dg.


Название: Re: Приложение, получающее собщения, и отправ
Отправлено: st.paul89 от Апрель 04, 2010, 19:41
То есть TTL будет по умолчанию выставлен максимально возможным?
Большое спасибо за ответ, остался открытый вопрос как сделать тоже самое с tcp пакетами.


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: mcrads от Апрель 05, 2010, 19:00
я тоже себе задавался таким вопросом и пришел к выводу что никак (((


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: SimpleSunny от Апрель 05, 2010, 19:07
Для TCP подобным образом тоже можно сделать такое.
А зачем нужен такой сервер?


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: st.paul89 от Апрель 08, 2010, 00:01
Как подобным образом сделать для TCP ? Не могу найти нужных методов или не там ищу.
Программа нужна для тестирования некого оборудования, скажем так.


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: mcrads от Апрель 10, 2010, 13:52
мне тоже интересно тогда - как?


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: majatu от Апрель 29, 2010, 12:18
очень интересно как сделать такое же с QTcpSocket


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: bigboa от Апрель 29, 2010, 15:06
Может подойдет такой вариант:
поднимаешь QTcpServer на прослушивание порта, пусть QTcpServer server, на сигнал newConnection вешаешь свой слот в котором делаешь следущее:

QTcpSocket * socket = server.nextPendingConnection ();

далее на сигнал сокета readyRead вешаешь свой слот в котором читаешь данный из сокета, а потом этиже данные в этот сокет и отправляешь.


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: majatu от Апрель 30, 2010, 14:06
2 bigboa
до указателя на вызывающий сокет я уже допер, но все равно спасибо, а вот как быть на клиенте, тоже надо ставить qtcpserver? или qtcpsocket может и сам принимать входящие соединение?

p.s. Вопрос даже скорее в том, что если клиент за файрволлом, то на обратное соединение пропустит? ведь если я вызываю скажем 80 порт, то и ответ идет на 80. И интересно как он вообще все это реализует


Название: Re: Приложение, получающее собщения, и отправляющее их обратно отправителю
Отправлено: aarlan от Май 26, 2010, 15:12
2 majatu
клиентский сокет(QTcpSocket) в принципе не принимает соединение. После того как сервер(QTcpServer) примет соединение от клиента, QTcpSocket уходит в состояние ConnectedState, испуская сигнал connected().
На этот сигнал клиент пишет данные серверу, тот читает(как сказал bigboa), отправляет обратно, опять читает клиент.