Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:qt:network [2021/09/30 04:49] admin |
develop:qt:network [2021/10/27 04:33] (текущий) admin |
||
---|---|---|---|
Строка 8: | Строка 8: | ||
===== QTcpServer ===== | ===== QTcpServer ===== | ||
- | ----- | ||
Позволяет принимать Tcp-соединения, | Позволяет принимать Tcp-соединения, | ||
Строка 20: | Строка 19: | ||
===== QAbstractSocket ===== | ===== QAbstractSocket ===== | ||
- | ----- | ||
{{ : | {{ : | ||
Строка 90: | Строка 88: | ||
===== Пример клиент/ | ===== Пример клиент/ | ||
- | |||
- | **upd:** В данном примере нужно организовать передачу служебной инфы.\\ | ||
- | Есть примеры в которых передают инфу через **QDataStream** и пишут эти данные, | ||
- | В объекте потока есть (унаследованный) метод **seek()**, который управляет указателем в файле...\\ | ||
- | |||
==== Сервер ==== | ==== Сервер ==== | ||
Строка 382: | Строка 375: | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Еще пример клиент/ | ||
+ | Сервер поддерживает **множественное подключение**, | ||
+ | |||
+ | При передаче, | ||
+ | **Программные** формируются при каждом вызове метода **write()**, | ||
+ | |||
+ | **Физические** формируются уже на транспортном уровне, | ||
+ | |||
+ | Передача ведется потоковая, | ||
+ | |||
+ | Служебную инфу пишем с помощью датаСтрим, | ||
+ | |||
+ | Cчитывание 4ех байт остается корректным до тех пор пока программный пакет < 4gb, т.к. в эти 4 байта умещено интовое значение, | ||
+ | Если программный пакет будет больше, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | |||
+ | sserv.h | ||
+ | <code cpp-qt> | ||
+ | |||
+ | </ | ||
+ | |||
+ | sserv.cpp | ||
+ | <code cpp-qt> | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | **Примечания: | ||
+ | :?: Установка соединения (**connectToHost()**) проходит асинхронно, | ||
+ | Правда в случае ошибки соединения, | ||
+ | :?: Запись можно делать из файла сразу в метод **write()**, | ||
+ | **write()** принимает **QByteArray**, | ||
+ | :?: Что касается **проверки и установления** коннекта: | ||
+ | в нашем случае сокет может быть в след состояниях: | ||
+ | **0** - не подключен - нужно **вызвать коннект**\\ | ||
+ | **1,2** - выполняет поиск и начал устанавливать соединение - соединения еще нет, но и делать вроде ничего не надо, правда неизвестно может ли оно быть зависшим в этот состоянии ?, думаю тут- **ничего не делать**\\ | ||
+ | **3** - установленно - **ничего не делать**\\ | ||
+ | **6** - вот вот закроется - т.е. запрошен дисконнект, | ||
+ | |||
+ | Что касается отправки файла, пишем данные кусками в метод **write()**, | ||
+ | В случае ошибки, | ||
+ | Так же, после вызова **write()** и до фактической отправки данных нужно какое то время, до этого данные копятся в буфере (видно в **bytesToWrite()**), | ||
+ | |||
+ | Данные **пишутся** так же **пакетами**, | ||
+ | Если нет коннекта, | ||
+ | |||
+ | |||
+ | |||
+ | sc.h | ||
+ | <code cpp-qt> | ||
+ | |||
+ | </ | ||
+ | |||
+ | sc.cpp | ||
+ | <code cpp-qt> | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||