![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Norrius |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Подключение одного только windows.h дает много ошибок про HANDLE. Подключение дополнительно winbase.h приводит к другим ошибкам вместо неопределнного хендла: DWORD does not name a type, то же говорит про WORD и WCHAR. Я ничего не понимаю в инклудах windows и winapi, помогите, пожалуйста.
это значит, что он в двух заголовочниках каким-то образом определён стал. Подключение только windows.h (дополнительно к qt-овским заголовочным) дает эту ошибку. это значит, что он в двух заголовочниках каким-то образом определён стал. Подключение только windows.h (дополнительно к qt-овским заголовочным) дает эту ошибку. А, нет, не совсем так: есть также подключение iostream и math.h. Подключение windows.h до них вроде бы помогло, буду проверять дальше. Windows.h содержит включение winsock2.h и блокирует подключение winsock.h, так что
ни на что не влияет. С библиотеками разобрался (по крайней мере, оно компилируется), но не удается использовать setsockopt():
дает ошибку вида "неверная конвертация int* в const char *". Кастую:
И получается: undefined reference to `setsockopt@20'. Так как использовать эту функцию? можно передавать исходное сообщение пакетами, скажем, по 2048 байтов. Тогда не будет ожидания доставки всего сообщения, только в приёмнике нужно будет собирать сообщение, учитывая свой протокол. Зато это можно сделать в отдельном потоке Мне нужна быстрая реакция на каждый пакет. Ждать, пока сообщений по 5-10 байт наберется на два килобайта, не получится. |
|
|
Norrius |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ошибка побеждена добавлением
в проектный файл. |
|
|
Norrius |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Не уверен, что помогло и вообще в этом дело. Но не похоже, чтобы соединение стало работать быстрее. setsockopt() с обоих сторон возвращает ноль.
Выглядит это примерно так: вначале реакция быстрая, но со временем (или действиями) время отклика увеличивается. |
|
|
PAFOS |
![]()
Сообщение
#14
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
из msdn - If no error occurs, setsockopt returns zero.
т.е. ноль это хорошо)
подробнее ? Сообщение отредактировал PAFOS - 24.8.2012, 12:39 |
|
|
Norrius |
![]()
Сообщение
#15
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
ноль это хорошо Знаю, это и имел в виду. У клиента и у сервера есть по таймеру. Таймер запускается около 30 раз в секунду и запускает в числе прочего и отправку данных, но некоторые события отправляют информацию сразу же, при получении. Я сделал так, чтобы при нажатии Z отправлялся специальный пакет, содержащий количество прошедших тактов таймера клиента. В консоли сервера видно, что информация о нажатом Z сначала приходит мгновенно, но затем начинает запаздывать, все сильнее и сильнее. Такое впечатление, что данные просто не успевают отправляться, поэтому "складируются" и постепенно тормозят передачу. Но тесты с iptraf на основном компе показывали, что обмен данными идет со скоростью около 40 кБ/с... |
|
|
PAFOS |
![]()
Сообщение
#16
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Так может быть проблема где-нибудь в коде?
|
|
|
Norrius |
![]()
Сообщение
#17
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
В каком смысле? Какой тип проблемы может приводить к этому?
Замена TCP на UDP (код передачи практически идентичен, остальное не меняется), к слову, полностью избавляет от задержек. |
|
|
PAFOS |
![]()
Сообщение
#18
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
ты применяешь setsockopt на сервере для QTcpSocket или для QTcpServer?
Сообщение отредактировал PAFOS - 24.8.2012, 13:39 |
|
|
Norrius |
![]()
Сообщение
#19
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Для сокета. |
|
|
PAFOS |
![]()
Сообщение
#20
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
сложно так сказать...
возьми wireshark и посмотри реально как пакеты шлются.... там можно настроить фильтр по IP:PORT TCP протокол. ведется логирование и т.п. |
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 10.7.2025, 0:10 |