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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Приложение, получающее собщения, и отправляющее их обратно отправителю  (Прочитано 7355 раз)
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.027 секунд. Запросов: 18.