Название: Непонятки с QTcpSocket Отправлено: ploop от Январь 28, 2014, 09:58 Имеется такой код, вызывается по таймеру раз в секунду:
Код Вот что получаю: Код: QTime("10:42:44") "12345" Дебаг (и лог) явно показывает, что send_to_client вызывается один раз. При этом на клиенте ловим повторяющиеся данные. Если размер посылки небольшой (помещается в один сетевой пакет), то алгоритм нормально её декодирует (повтор отбросит). Но если надо сбросить посылку пожирнее, то внутри её получается каша, что логично. Собственно, почему так происходит? Название: Re: Непонятки с QTcpSocket Отправлено: Old от Январь 28, 2014, 10:05 Потому что данные от отправителя склеиваются сетевым стеком в один пакет, все согласно протокола.
Название: Re: Непонятки с QTcpSocket Отправлено: ploop от Январь 28, 2014, 10:13 Я всё понимаю, но тут другая ситуация. Отправляю данные один раз (вручную например), а получаю несколько копий.
Код
Лог отправляющей стороны: Код: debug: [28.01.2014 11:09:29.256]: 1 Принимающая сторона: Код: QTime("11:09:29") "12345" Откуда 10 строк вместо восьми? ЗЫ: Лог сделал только что, коннект - дисконнект, всё как есть. Название: Re: Непонятки с QTcpSocket Отправлено: Old от Январь 28, 2014, 10:31 Странная ситуация.
А точно отсылка через этот сокет происходит только в send_to_client? Может еще кто-то может это писать в слот? Название: Re: Непонятки с QTcpSocket Отправлено: ploop от Январь 28, 2014, 10:39 Сокет сидит в отдельном потоке, сколько клиентов - столько потоков. Конструктор тоже проверял, создаётся один поток, один сокет. Вот код:
Код
Внутри конструктора объекта: Код
Все тесты с одним клиентом. Если их несколько - ситуация аналогична, только с разными указателями на сокеты/потоки/объекты. То есть всё ровно. Самое интересное - взял проект вчера домой, дабы спокойно поковыряться, и не смог воспроизвести ошибку, как ни старался! Всё работает чётко. Может что-нибудь связанное с системой быть? Порты разные пробовал... Название: Re: Непонятки с QTcpSocket Отправлено: ploop от Январь 28, 2014, 10:43 Да тут просто по логике: если send_to_client вызовет кто-то ещё, увидим запись в логе.
Название: Re: Непонятки с QTcpSocket Отправлено: Old от Январь 28, 2014, 10:48 Да тут просто по логике: если send_to_client вызовет кто-то ещё, увидим запись в логе. Ну кто-то может писать в сокет и не в этой функции имея на него указатель. :)Похоже, что у вас действительно проблемы не с программой, а с сетью. Какая у вас платформа и как тестируете, через localhost или разные машины? Название: Re: Непонятки с QTcpSocket Отправлено: ploop от Январь 28, 2014, 10:53 Да, через localhost
Ubuntu 12.04 (в системе чего только не понаставлено, но что может быть причиной не могу сообразить). Сборки будут и под Win32. Наверное попробую собрать тестовый проект на другой машине... Цитировать Ну кто-то может писать в сокет и не в этой функции имея на него указатель Прошерстил проект по ключевому слову "Write", ничего криминального :(Название: Re: Непонятки с QTcpSocket Отправлено: ploop от Январь 28, 2014, 13:26 Кажется победил проблему.
Скомпилив на Windows и запустив, увидел ошибки в логе во время send_to_client: Код: QSocketNotifier: socket notifiers cannot be enabled from another thread И до меня дошло: сам объект находится в новом потоке, а сокет - в старом! Так как указатель на сокет я в конструктор передаю, просто добавил в конструктор это: Код
Вот этот тестовый код стал чётко работать. С реальными данными не знаю - весь код разворошил, буду в кучу собирать и пробовать :) ---- Ну да, всё собрал. Мегабайтные куски друг за другом летают только в путь, и разбираются без ошибок. Аккуратнее с потоками, господа :) Название: Re: Непонятки с QTcpSocket Отправлено: OKTA от Январь 30, 2014, 17:30 Не уж то наследовался от QThread??))
Название: Re: Непонятки с QTcpSocket Отправлено: ploop от Январь 30, 2014, 19:06 Нет, зачем?
Весь код я привёл выше. Собственно, это всё. Сегодня проверили сервер с несколькими десятками клиентов и большой нагрузкой на сеть (при чём некоторые клиенты на плохом соединении) - нормально всё, падений нет, утечек, по мнению Valgrind, - тоже. Название: Re: Непонятки с QTcpSocket Отправлено: vulko от Март 03, 2014, 09:05 У меня похожая непонятка. Отправляю через сокет 128 байт, получаю, закрываю, запрашиваю снова, получаю и т.д.
Однако иногда приходит пакет 4224 байт, хз откуда берущийся... Название: Re: Непонятки с QTcpSocket Отправлено: OKTA от Март 03, 2014, 09:14 а что в пакете-то?))
Название: Re: Непонятки с QTcpSocket Отправлено: vulko от Март 03, 2014, 09:23 а что в пакете-то?)) у меня? сериализованный данные. массив из 8 элементов структуры, состоящей из 1 инта и 3х флоутов. 8 элементов по 16 байт, итого 128 байт. откуда 4224 байта вообще хз... Название: Re: Непонятки с QTcpSocket Отправлено: LisandreL от Март 03, 2014, 09:29 Как вариант - 33 ваших пакета. ;)
Название: Re: Непонятки с QTcpSocket Отправлено: OKTA от Март 03, 2014, 09:42 да, вопрос был именно в этом пакете ;D
|