Куда теряются пакеты ? QTcpServer QTcpClient, блокирующие сокеты |
Здравствуйте, гость ( Вход | Регистрация )
Куда теряются пакеты ? QTcpServer QTcpClient, блокирующие сокеты |
Litkevich Yuriy |
15.7.2009, 19:53
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
kwisp |
16.7.2009, 12:07
Сообщение
#12
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
pirks,
а что разбираться то. уже всё подсказали. |
|
|
ViGOur |
16.7.2009, 19:03
Сообщение
#13
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
что ??? никто незнает где ошибка ? толи все ленивые толи сами нихера не знают. Что за форум такой ... ёпт. pirks, устное предупреждение, еще раз будут подобные выражения, будет БАН! Тебе уже сказали в чем ошибка, а ты так и не ответил: Скажи, чем тот код, что ты привел отличается от того, что приведен тобой в начале? Просто распиши словами приведенный тобой код.
Сообщение отредактировал ViGOur - 16.7.2009, 19:04 |
|
|
pirks |
16.7.2009, 22:04
Сообщение
#14
|
Студент Группа: Участник Сообщений: 21 Регистрация: 5.7.2009 Пользователь №: 876 Спасибо сказали: 1 раз(а) Репутация: 0 |
Я расписал же , слвами между прочим ) Русскими даже.
А насчёт тех потдержки, я ничего не перепутал. Если понимаешь суть происходящего, этот так трудно ответить ? нафиг тогда форум нужен, если всем интересны лишь свои проблемы. Типа я всё знаю но никому не скажу(впадлу, лень, неохота ...). Тут проблема не в алгоритме работы с протоколами, и сокетами. Есть некие моменты в кт, которые не отмечены в документации должным образом. Вот эти самые вещи по идеи должны знать люди сталкивавшиеся ранее с этим. и мне не нужно рассказывать про TCP IP, он не представляет особой сложности. по нему есть спецификация и много толстых книжек. А вот сеть в кт это неизвестный лес, документации минимум, примеры отвратительны. и самое то что народу пользующих её мало. Помойму проще написать свой класс работы с сокетами, и потоками для создания пакетов, чем дождаться ответа от знающих. |
|
|
AD |
16.7.2009, 22:31
Сообщение
#15
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
pirks, а есть какой-нибудь заголовок пакета? Хоть что-то (помимо длины) по которому можно определить, что это пакет? Я завтра могу выложить кусок программы работы с COM-портом, аналогия очень большая. Думаю, что чем-то поможет....
Да, кстати. Почему бы не читать побайтово? Пришел байт - прочли, дописали в пакет. Итак, пока не сформирован пакет. Как только сформирован - начали читать следующий.... Попробуйте так! Пусть не самый эффективный метод, но надежный! |
|
|
ViGOur |
16.7.2009, 23:14
Сообщение
#16
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Почему бы не читать побайтово? Пришел байт - прочли, дописали в пакет. Итак, пока не сформирован пакет. Как только сформирован - начали читать следующий.... Попробуйте так! Пусть не самый эффективный метод, но надежный! При большах объемах будет очень и очень медленный прием данных. Я расписал же , слвами между прочим Ты расписал поверхностно, а если бы расписал подробно, то думаю сам бы дошел, что проблемный кусок у тебя:
Ключевое в твоей ошибке: читаем данные пока полученно данных больше или равно blockSize. Допустим ты отправил 3 пакета по 1024 байт, значит у тебя blockSize == 1024. Ты получил 1 пакет и начинаешь его читать по этому условию, но у тебя идет склейка 1 и 2 пакетов (тоесть 2048 байт) ты читаешь только первый пакет и успешно игнорируешь 2. В принципе та же самая ситуация, что и была. Где у тебя вычисление оставшего для получения blockSize? Где вычисления размера полученных байт (ты же можешь получить сразу несколько пакетов)? Нет. Потому ты и теряешь данные. При работе с обычными сокетами было всё отлично, всё доходило и быстро и надёжно. А тут ((((((( Если бы ты хорошо знал тему сокетов, то не говорил бы, что что их извратили в Qt. Как я понял ты еще не работал с boost или ACE сокетами, вот там точно изврат, если досканально не знаешь основы работы с сокетами.
имхо - извратили QT сокеты своей обёрткой. К сожалению писать нужно именно на них. |
|
|
pirks |
21.7.2009, 22:24
Сообщение
#17
|
Студент Группа: Участник Сообщений: 21 Регистрация: 5.7.2009 Пользователь №: 876 Спасибо сказали: 1 раз(а) Репутация: 0 |
Почему бы не читать побайтово? Пришел байт - прочли, дописали в пакет. Итак, пока не сформирован пакет. Как только сформирован - начали читать следующий.... Попробуйте так! Пусть не самый эффективный метод, но надежный! При большах объемах будет очень и очень медленный прием данных. Я расписал же , слвами между прочим Ты расписал поверхностно, а если бы расписал подробно, то думаю сам бы дошел, что проблемный кусок у тебя:while ((newTcpSocket.bytesAvailable() >= blockSize) && (blockSize != 0)) Ключевое в твоей ошибке: читаем данные пока полученно данных больше или равно blockSize. Допустим ты отправил 3 пакета по 1024 байт, значит у тебя blockSize == 1024. Ты получил 1 пакет и начинаешь его читать по этому условию, но у тебя идет склейка 1 и 2 пакетов (тоесть 2048 байт) ты читаешь только первый пакет и успешно игнорируешь 2. В принципе та же самая ситуация, что и была. Где у тебя вычисление оставшего для получения blockSize? Где вычисления размера полученных байт (ты же можешь получить сразу несколько пакетов)? Нет. Потому ты и теряешь данные. При работе с обычными сокетами было всё отлично, всё доходило и быстро и надёжно. А тут ((((((( Если бы ты хорошо знал тему сокетов, то не говорил бы, что что их извратили в Qt. Как я понял ты еще не работал с boost или ACE сокетами, вот там точно изврат, если досканально не знаешь основы работы с сокетами. имхо - извратили QT сокеты своей обёрткой. К сожалению писать нужно именно на них. Сокеты это сокеты беркли ) их я знаю. Это давным давно придуманная технология. Всё остальное эт обёртки. Они нужны только для упрощения и кросплатформенности. |
|
|
AD |
21.7.2009, 22:29
Сообщение
#18
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
pirks, очень сложно помочь человеку, если он не слушает советы. Перечитай сообщения ViGOur(а), найди у себя в коде указанные узкие места и попробуй их переделать - возможно, и поможет!
Сообщение отредактировал AD - 21.7.2009, 22:31 |
|
|
ViGOur |
21.7.2009, 22:46
Сообщение
#19
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Сокеты это сокеты беркли ) их я знаю. Это давным давно придуманная технология. Всё остальное эт обёртки. Они нужны только для упрощения и кросплатформенности. Если бы это было так, то не нужно было бы виндовый сокеты (WSA) скрещивать с BSD cокетами (беркли) с макросами ifdef UNIX и прочими. Хоть сокеты Windows и разработанный на основе сокетов Беркли, но частично. Чтобы убедиться в этом глянь кроссплатформенные реализации Boost (asio), ACE, POCO, Qt ...Ты споришь не там где нужно, лучше прочти мой последний ответ тебе, я описал в чем проблемы. |
|
|
pirks |
22.7.2009, 6:14
Сообщение
#20
|
Студент Группа: Участник Сообщений: 21 Регистрация: 5.7.2009 Пользователь №: 876 Спасибо сказали: 1 раз(а) Репутация: 0 |
Сокеты это сокеты беркли ) их я знаю. Это давным давно придуманная технология. Всё остальное эт обёртки. Они нужны только для упрощения и кросплатформенности. Если бы это было так, то не нужно было бы виндовый сокеты (WSA) скрещивать с BSD cокетами (беркли) с макросами ifdef UNIX и прочими. Хоть сокеты Windows и разработанный на основе сокетов Беркли, но частично. Чтобы убедиться в этом глянь кроссплатформенные реализации Boost (asio), ACE, POCO, Qt ...Ты споришь не там где нужно, лучше прочти мой последний ответ тебе, я описал в чем проблемы. хм, сокеты виндовс..... да это в принципе они ничего сами не писали, взяли бсдишные и закрыли исходники! первая версия это один в один, за исключением инициализации, самого типа дескриптора да названия парочки структур ))) Мелкософт в принципе не способен сам придумать ничего нормального. всё покупают да переделывают. >>pirks, очень сложно помочь человеку, если он не слушает советы. Перечитай сообщения ViGOur(а), найди у себя в коде указанные узкие места и попробуй их переделать - >>возможно, и поможет! я переделывал по разному, а узких мест по склейке пакеов я не вижу. Я проверяю пакеты на целостность и жду ) Не вижу траблы. |
|
|
Текстовая версия | Сейчас: 30.11.2024, 13:16 |