Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Июнь 14, 2011, 15:31



Название: TCP/IP
Отправлено: demaker от Июнь 14, 2011, 15:31
Подскажите пожалуйста, можно ли использовать m_ptcpServer->nextPendingConnection()
 для связей с несколькими клиентами и как сделать это грамотно? Спасибо!


Название: Re: TCP/IP
Отправлено: RedDog от Июнь 14, 2011, 15:44
В примерах куча информации
а nextPendingConnection() возвращает указатель на сокет, через который будет идси связь с конкретным клиентом
сколько клиентов, столько сокетов и создатся, при этом nextPendingConnection() вовратит указатель на сокет для последнего подключившегося клиента


Название: Re: TCP/IP
Отправлено: LisandreL от Июнь 14, 2011, 15:51
nextPendingConnection() вовратит указатель на сокет для последнего подключившегося клиента
Разве на последнего, а не на первого из необработанных?


Название: Re: TCP/IP
Отправлено: RedDog от Июнь 14, 2011, 15:54
Разве на последнего, а не на первого из необработанных?
Ну имелось ввиду, что сокеты по мере подключения все же будут обрабатываться а не в очередь выстраиваться, поэтому последнего, а предыдущие уже были обработаны.


Название: Re: TCP/IP
Отправлено: demaker от Июнь 14, 2011, 16:02
Ну да:
QTcpSocket* ptrClient = ptrServer->nextPendingConnection();
и обрабатываем сигналы получаемые от ptrClient.

А как распознать какой клиент к какому сокету относится или это происходит автоматически?
с помощью  QTcpSocket* pClientSocket = (QTcpSocket*)sender(); ??? типа кто послал сигнал с тем и работаем, а остальные в очередь, если при подключении с ними ничего не происходило.Так?


Название: Re: TCP/IP
Отправлено: RedDog от Июнь 14, 2011, 16:07
ну можно распознавать через адрес:
Код:
QHostAddress QAbstractSocket::peerAddress ()
можно завести ассоциативный массив, где ключом будет некое описание клиента, а значением - указатель на сокет клиента


Название: Re: TCP/IP
Отправлено: demaker от Июнь 14, 2011, 16:10
А что значит некое описание клиента??? :) Если можно, поподробнее.


Название: Re: TCP/IP
Отправлено: demaker от Июнь 14, 2011, 16:15
Можно  вот так: сделать массив указателей на сокет, а ключом будет IP - адрес ???


Название: Re: TCP/IP
Отправлено: RedDog от Июнь 14, 2011, 16:34
Можно  вот так: сделать массив указателей на сокет, а ключом будет IP - адрес ???
А что это даст? айпишник можно и из самого сокета в любой момент получить


Название: Re: TCP/IP
Отправлено: demaker от Июнь 14, 2011, 20:40
Ну а как тогда быть??? Чтобы сделать массив указателей сокетов с ключом ???


Название: Re: TCP/IP
Отправлено: Amigo_sa от Июнь 14, 2011, 21:32
Нужно идти от задачи. Если ваш сервер просто раздает какие то одинаковые данные клиентам, то вам смысла нет знать, какой именно клиент к вам подключился. Если клиентам нужна разная информация, то можно придумать разные запросы от клиентов, в которых указывается, что нужно возвращать. Если вам нужно все-таки различать клиенты по адресам, то вы можете, к примеру, завести множество из переменных типа пара(адрес клиента, локальный сокет клиента)
Код:
QSet<QPair<QHostAddress, quint16> > m_clients;
......

QTcpSocket * peerSocket = m_server->nextPendingConnection();
QPair<QHostAddress, quint16> peerData = QPair<QHostAddress, quint16>(peerSocket->peerAddress(), peerSocket->peerPort());
m_clients.insert(peerData);

По количеству элементов в этом множестве вы можете приблизительно оценить, сколько клиентов к вам подключены. Правда, после реконнекта, локальный порт и может быть адрес уже будет другим, даже если эта тот же экземпляр клиентской программы.
В общем, смотря что вам нужно сделать.


Название: Re: TCP/IP
Отправлено: demaker от Июнь 16, 2011, 13:52
Понял, Спасибо :)