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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Приложение, получающее собщения, и отправляющее их обратно отправителю  (Прочитано 7161 раз)
st.paul89
Гость
« : Апрель 04, 2010, 18:47 »

Всем доброго времени суток.
Суть проблемы в следующем - нужно написать приложение, которое бы принимало с определенного порта все сообщения от сервера и отсылал их ему обратно. Можно ли реализовать такое дело, если адрес отсылающего не известен заранее, то есть нужно из пришедшей дейтаграммы выдернуть ип отсылающего. Если нет, то как реализовать такое приложение, если считать что адресс отправителя известен.

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

Всем заранее спасибо за ответы!
Записан
SimpleSunny
Гость
« Ответ #1 : Апрель 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);
    }
}
« Последнее редактирование: Апрель 04, 2010, 19:00 от SimpleSunny » Записан
st.paul89
Гость
« Ответ #2 : Апрель 04, 2010, 19:18 »

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

Не надо увеличивать TTL. Так как dg (datagram) добралась до сервера, ибо мы её уже обрабатываем Улыбающийся А в ответ мы будем посылать уже новые dg.
Записан
st.paul89
Гость
« Ответ #4 : Апрель 04, 2010, 19:41 »

То есть TTL будет по умолчанию выставлен максимально возможным?
Большое спасибо за ответ, остался открытый вопрос как сделать тоже самое с tcp пакетами.
« Последнее редактирование: Апрель 04, 2010, 19:53 от st.paul89 » Записан
mcrads
Гость
« Ответ #5 : Апрель 05, 2010, 19:00 »

я тоже себе задавался таким вопросом и пришел к выводу что никак (((
Записан
SimpleSunny
Гость
« Ответ #6 : Апрель 05, 2010, 19:07 »

Для TCP подобным образом тоже можно сделать такое.
А зачем нужен такой сервер?
Записан
st.paul89
Гость
« Ответ #7 : Апрель 08, 2010, 00:01 »

Как подобным образом сделать для TCP ? Не могу найти нужных методов или не там ищу.
Программа нужна для тестирования некого оборудования, скажем так.
Записан
mcrads
Гость
« Ответ #8 : Апрель 10, 2010, 13:52 »

мне тоже интересно тогда - как?
Записан
majatu
Гость
« Ответ #9 : Апрель 29, 2010, 12:18 »

очень интересно как сделать такое же с QTcpSocket
Записан
bigboa
Гость
« Ответ #10 : Апрель 29, 2010, 15:06 »

Может подойдет такой вариант:
поднимаешь QTcpServer на прослушивание порта, пусть QTcpServer server, на сигнал newConnection вешаешь свой слот в котором делаешь следущее:

QTcpSocket * socket = server.nextPendingConnection ();

далее на сигнал сокета readyRead вешаешь свой слот в котором читаешь данный из сокета, а потом этиже данные в этот сокет и отправляешь.
Записан
majatu
Гость
« Ответ #11 : Апрель 30, 2010, 14:06 »

2 bigboa
до указателя на вызывающий сокет я уже допер, но все равно спасибо, а вот как быть на клиенте, тоже надо ставить qtcpserver? или qtcpsocket может и сам принимать входящие соединение?

p.s. Вопрос даже скорее в том, что если клиент за файрволлом, то на обратное соединение пропустит? ведь если я вызываю скажем 80 порт, то и ответ идет на 80. И интересно как он вообще все это реализует
« Последнее редактирование: Апрель 30, 2010, 14:09 от majatu » Записан
aarlan
Гость
« Ответ #12 : Май 26, 2010, 15:12 »

2 majatu
клиентский сокет(QTcpSocket) в принципе не принимает соединение. После того как сервер(QTcpServer) примет соединение от клиента, QTcpSocket уходит в состояние ConnectedState, испуская сигнал connected().
На этот сигнал клиент пишет данные серверу, тот читает(как сказал bigboa), отправляет обратно, опять читает клиент.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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