Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2017, 19:29   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию QTcpSocket окончание передачи данных

Вот так передаются данные
Код:
void sendToClient(const QString &str_message)
{
    socket->write(str_message.toLocal8Bit());
}
Как узнать что сокет закончил передачу всех данных?

Вообще тут вопрос даже в том- как узнать, что сокет занят приемом или передачей данных?

Последний раз редактировалось SAMOUCHKA; 26.07.2017 в 19:48.
SAMOUCHKA вне форума Ответить с цитированием
Старый 27.07.2017, 07:19   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

А сокеты у вас блокирующие или не блокирующие(асинхронные)?
Для асинхронных делаем как описано в: https://wiki.qt.io/Threads_Events_QObjects/ru
Второй вариант, вы можете реализовать квитирование в своём прикладном протоколе.
Заводим объект с состоянием сокета и меняем его.

Цитата:
Вообще тут вопрос даже в том- как узнать, что сокет занят приемом или передачей данных?
А смысл? Tcp - это полнодуплексный протокол в нём приём и передача идут паралельно.

Любая синхронизация снижает скорость работы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.07.2017, 11:48   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
Как узнать что сокет закончил передачу всех данных?
В принципе для этого есть вызов shutdown() но он похоже в Qt не используется.
Вам остается самому реализовать в своем протоколе сигнал "у меня нет больше данных для отправки", либо изначально сообщать ожидаемый объем данных.
waleri вне форума Ответить с цитированием
Старый 27.07.2017, 13:08   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
В принципе для этого есть вызов shutdown() но он похоже в Qt не используется.
Вам остается самому реализовать в своем протоколе сигнал "у меня нет больше данных для отправки", либо изначально сообщать ожидаемый объем данных.
..не совсем так, передатчик должен вызвать shutdown(), тем самым сигнализируя - все.
Т.е. ваш прикладной протокол может иметь 1 из следующих возможностей:

1. Самое простое - по окончании записи вызывает shutdown - т.е. рвет соединение.
2. Пишет сначала длину, потом данные.
3. Пишет данные и оканчивает их терминальным условным символов.
4. Пишет блоки фиксированой длины.

Эта схема вообще на любых языках/библиотеках применяется для работы с сетью (в т.ч., например, с кабелем COM).

Последний раз редактировалось alexzk; 27.07.2017 в 13:10.
alexzk вне форума Ответить с цитированием
Старый 27.07.2017, 16:55   #5
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Сокеты асинхронные.

Цитата:
Tcp - это полнодуплексный протокол в нём приём и передача идут паралельно.
То есть возможен одновременный прием и передача?
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передачи данных Eihmann Помощь студентам 0 12.03.2013 22:20
Скорость передачи данных Человек_Борща Работа с сетью в Delphi 4 23.12.2012 18:51
Порядок передачи данных.+ Farrel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.05.2011 19:11
Странные передачи данных bulldog5293 Работа с сетью в Delphi 14 28.11.2010 23:33