Передача данных в отдельном потоке. Сервер не успевает обработать данные. |
Здравствуйте, гость ( Вход | Регистрация )
Передача данных в отдельном потоке. Сервер не успевает обработать данные. |
kibsoft |
13.4.2010, 20:29
Сообщение
#1
|
Участник Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: 2 |
Есть сервер и клиент (отсылает данные, например файл):
Клиент:
На сервере есть слот, соединенный с сигналом readyRead сокета, но видимо данные приходят так быстро, что сервер не успевает сделать нужные действия (а именно записать на диск). Что можно придумать? Можно ли как то на клиенте узнать считаны ли данные сервером или нет(и ждать этого момента)? В голову приходит только одно: от сервера высылать уведомление о принятых данных, чтобы клиент мог дальше передавать их (но мне кажется, что что-то не то). |
|
|
BRE |
13.4.2010, 20:40
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Покажи как читаются данные на другой стороне.
|
|
|
kibsoft |
13.4.2010, 20:43
Сообщение
#3
|
Участник Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: 2 |
|
|
|
BRE |
13.4.2010, 20:49
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Посмотри примеры еще раз и обрати внимание на то, как определена эта переменная:
|
|
|
kibsoft |
13.4.2010, 21:02
Сообщение
#5
|
Участник Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: 2 |
Посмотри примеры еще раз и обрати внимание на то, как определена эта переменная:
Спасибо, что подсказали. Объявил в хедере. Но все равно сервер не успевает записывать данные. В консоль вывел количество раз запуска слота и записи данных. Передается файл размером 42Кб: Цитата 1 //слот о принятии данных вызван Writing: 1 //запись Writing: 2 2 3 4 5 6 На самом деле, если я передаю по 1 Кб, то дожно быть около 42 вызовов.. Или я что-то не так думаю? |
|
|
BRE |
13.4.2010, 21:05
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Может быть не так, алгоритм Нагла думаю включен, поэтому TCP-стек скорее всего пакеты объединяет.
|
|
|
kibsoft |
14.4.2010, 0:03
Сообщение
#7
|
Участник Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: 2 |
Может быть не так, алгоритм Нагла думаю включен, поэтому TCP-стек скорее всего пакеты объединяет. Щас продебажил, на сервере (в слоте обработки) сокет действительно собирает пакеты не по 1024 байта, как отсылаются, а иногда по 30Кб даже, поэтому мой обработчик естественно не может определить по флагам(FILEBYTES) нужно ли записывать инфу. Как можно этого избежать? Если отключить алгоритм Нагла, то будет в разы медленней? И вообще можно ли его отключить? И вообще есть у кого-то какие-нибудь предложения? |
|
|
BRE |
14.4.2010, 6:49
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
А не нужно отключать алгоритм Нагла, нужно придерживаться при чтении своего же протокола.
Ты пишешь по 1K, а при чтении читаешь все, со всеми управляющими командами. А нужно читать так же как пишешь по 1K. |
|
|
kibsoft |
14.4.2010, 13:21
Сообщение
#9
|
Участник Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: 2 |
А не нужно отключать алгоритм Нагла, нужно придерживаться при чтении своего же протокола. Ты пишешь по 1K, а при чтении читаешь все, со всеми управляющими командами. А нужно читать так же как пишешь по 1K. Т.е. не использовать QDataStream, а использовать read у объекта сокета? Не совсем понимаю как это реализовать. |
|
|
BRE |
14.4.2010, 14:08
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Проверь несколько раз, сколько байт (какими порциями) реально читает эта функция из сокета:
|
|
|
Текстовая версия | Сейчас: 24.11.2024, 2:36 |