8 семестр / Факультативные лабораторные работы / Qt / Лабораторная работа 1 (факультативно)
.pdf
Таблица 1.7
Функция |
int QTcpServer::maxPendingConnections() const |
Описание функции |
Возвращает максимальный размер очереди |
c)При поступлении запросов на подключение испускается сигнал newConnection (). Для того чтобы отслеживать запросы на подключение, необходимо присоединить сигнал newConnection() к пользовательскому слоту. Чтобы обработать новый запрос необходимо вызвать функцию nextPendingConnection (), которая берёт первый запрос из очереди, создаёт новый сокет для текущего соединения и возвращает указатель на него.
|
Таблица 1.8 |
|
|
|
|
Функция |
QTcpSocket * QTcpServer :: nextPendingConnection () |
|
Описание функции |
Берёт первый запрос из очереди, создаёт новый сокет для |
|
|
текущего соединения и возвращает указатель на него. |
|
После этого соединение установлено.
Клиентская часть
Рисунок 1.3 Диаграмма взаимодействия при установлении соединения (Клиентская часть)
На рисунке 1.3 приведена диаграмма взаимодействия при установлении соединения на стороне клиента, рассмотрим каждый шаг.
В Qt в отличии от SOCKET API не нужно вручную привязывать сокет к определённому локальному адресу или порту, так как до вызова функции connectToHost() сокет не создаётся. При вызове данной функции начинается проверка адреса по всем сетевым интерфейсам, если адрес доступен испускается сигнал hostFound(). При получении сигнала hostFound() создаётся сокет на подходящем сетевом интерфейсе, использующий произвольный свободный порт, и происходит попытка соединения. Если соединение удалось, то посылается сигнал Connected().
Таблица 1.9
Функция |
void QAbstractSocket::connectToHost( |
|
const QString & hostName, |
|
quint16 port, |
|
OpenMode openMode = ReadWrite, |
|
NetworkLayerProtocol protocol = AnyIPProtocol |
|
) |
Описание функции |
Проверяет доступность адреса hostname и порта port, создаёт |
|
системный сокет на подходящем сетевом интерфейсе, |
|
используя произвольный незадействованный порт и пытается |
|
установить соединение. |
Описание |
hostName – адрес сервера в сети |
параметров |
port – порт сервера |
|
openMode – режим, в котором будет происходить работа с |
|
сокетом. По умолчанию - режим для чтения и записи |
|
(ReadWrite) |
|
protocol – протокол сетевого уровня модели OSI. По |
|
умолчанию - протокол IPv4 или IPv6(AnyIPProtocol) |
1.4.2.2. Обмен данными
Рисунок 1.4 Диаграмма взаимодействия при передачи данных На рисунке 1.4 приведена диаграмма взаимодействия при обмене данными, рассмотрим каждый шаг.
Для отправки данных используется функция:
|
Таблица 1.10 |
|
|
|
|
Функция |
qint64 QIODevice::write( |
|
|
const QByteArray & byteArray |
|
|
) |
|
Описание функции |
Записывает byteArray в буфер для отправки. Возвращает количество байт, которые были записаны в буфер. В |
|
|
случае ошибки возвращает -1. |
|
После записи данных в буфер для отправки, данные будут поделены на пакеты (если это необходимо) и отправлены получателю.
При получении данных испускается сигнал void QIODevice::readyRead(). Для получения данных из буфера используется функция:
|
Таблица 1.11 |
|
|
|
|
Функция |
QByteArray QIODevice :: ReadAll () |
|
Описание функции |
Читает данные из буфера, записывает их в массив байт и |
|
|
возвращает его. В случае ошибки возвращает пустой массив. |
|
Размер буфера в Qt не ограничен.
1.4.2.3. Закрытие соединения
Для корректного завершения работы с сокетами используется функция:
|
Таблица 1.12 |
|
|
|
|
Функция |
QAbstractSocket :: disconnectFromHost () |
|
|
|
|
Описание функции |
Закрывает сокет, освобождает ресурсы. В случае если есть |
|
|
данные, ожидающие записи в буфер, закрытие сокета будет |
|
|
произведено после отправки всех данных. |
|
Для корректного завершения работы с сервером используется функция:
Таблица 1.13
Функция |
void QTcpServer::close() |
Описание функции |
Сервер перестаёт слушать порт |
Вслучае разрыва соединения происходит закрытие системного сокета
иосвобождение ресурсов.
1.4.2.4. Обработка ошибок
Для обработки ошибок используется функция:
|
Таблица 1.14 |
|
|
|
|
Функция |
QString QTcpServer::errorString() const |
|
|
|
|
Описание функции |
Возвращает удобочитаемое описание последней ошибки |
|
Так же для асинхронной обработки ошибок, при возникновении ошибки испускается сигнал error(QAbstractSocket::SocketError).
1.4.3. Клиент-серверные приложения без установления соединения
Рисунок 1.5 Диаграмма взаимодействия датаграмных сокетов.
При использовании датаграмных сокетов, не происходит процедуры установления соединения, поэтому их использование гораздо проще.
На рисунке 1.5 приведена диаграмма взаимодействия, при использовании датаграмных сокетов, рассмотрим каждый шаг:
a) Создание объекта QUdpSocket
|
Таблица 1.15 |
|
|
|
|
Конструктор |
QUdpSocket::QUdpSocket( |
|
|
QObject * parent = 0 |
|
|
) |
|
|
|
|
Описание |
parent – объект владелец QUdpSocket. При вызове деструктора |
|
параметров |
объекта владельца так же будут уничтожены все дочерние |
|
|
объекты. В случае если владелец не указан, необходимо |
|
|
вручную вызвать деструктор. |
|
b) Создание сокета, привязка к локальному адресу и порту |
|
|
|
Таблица 1.16 |
|
|
|
|
Функция |
bool QAbstractSocket::bind( |
|
|
const QHostAddress & address, |
|
|
quint16 port = 0, |
|
|
BindMode mode = DefaultForPlatform |
|
|
) |
|
Описание функции |
Создаёт сокет, связывая его с адресов address и портом porr. |
|
Описание |
address – локальный адресс |
|
параметров |
port – локальный порт, если порт = 0, то используется |
|
|
произвольный не использованный порт. |
|
|
mode – модель привязки сокета к локальному адресу, по |
|
|
умолчанию – стандартный для платформы(DefaultForPlatform) |
|
|
|
|
c) Отправка сообщений осуществляется с помощью функции: |
||
|
Таблица 1.17 |
|
|
|
|
Функция |
qint64 QUdpSocket::writeDatagram( |
|
|
const QByteArray & datagram, |
|
|
const QHostAddress & host, |
|
|
quint16 port |
|
|
) |
|
Описание функции |
Отправляет данные datagram, на адрес host и порт potr. В случае, |
|
|
если размер датаграммы слишком большой или произошла |
|
|
ошибка возвращает -1 |
|
Описание |
datagram – массив байт для отправки |
|
параметров |
host – адрес приёмного устройства |
|
|
port – порт приёмного устройства |
|
При поступлении датаграммы испускается сигнал void QIODevice::readyRead ().
d) Для получения датаграммы необходимо воспользоваться функцией: Таблица 1.18
Функция |
qint64 QUdpSocket::readDatagram( |
|
char * data, |
|
qint64 maxSize, |
|
QHostAddress * address= 0, |
|
quint16 * port = 0 |
|
) |
Описание функции |
Читает maxSize байт из буфера, сохраняет их в data, если |
|
указаны address и port, то сохраняет адрес отправителя в них. |
|
Возвращает количество прочитанных байт, если произошла |
|
ошибка, то возвращает -1. |
Описание |
data – массив байт для приёма |
параметров |
maxSize – размер массива байт |
|
address – адрес отправителя |
|
port – порт отправителя |
e) Для закрытия сокета используется функция:
Таблица 1.19
Функция |
void QIODevice::close() |
Описание функции |
Закрывает сокет |
1.5. Контрольные вопросы и задания.
1)Описать процесс установления соединения на стороне клиента.
2)Описать процесс установления соединения на стороне сервера.
3)Объяснить различия между обменом пакетами в ориентированных на соединение протоколах и не ориентированных на соединение протоколах.
4)Объяснить различия блокируемых и неблокируемых сокетов.
5)Объяснить, как реализуются асинхронные сокеты, в выбранной вами библиотеке.
