crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Тема закрытаНачать новую тему
> [Решено] UDP сервер для многих клиентов?, Ну а на самом деле просто быстрый сервер
Norrius
  опции профиля:
сообщение 24.8.2012, 9:48
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Подключение одного только windows.h дает много ошибок про HANDLE. Подключение дополнительно winbase.h приводит к другим ошибкам вместо неопределнного хендла: DWORD does not name a type, то же говорит про WORD и WCHAR. Я ничего не понимаю в инклудах windows и winapi, помогите, пожалуйста.

Цитата(Iron Bug @ 24.8.2012, 9:38) *
это значит, что он в двух заголовочниках каким-то образом определён стал.

Подключение только windows.h (дополнительно к qt-овским заголовочным) дает эту ошибку.

Цитата(Iron Bug @ 24.8.2012, 9:38) *
это значит, что он в двух заголовочниках каким-то образом определён стал.

Подключение только windows.h (дополнительно к qt-овским заголовочным) дает эту ошибку.

А, нет, не совсем так: есть также подключение iostream и math.h. Подключение windows.h до них вроде бы помогло, буду проверять дальше.

Windows.h содержит включение winsock2.h и блокирует подключение winsock.h, так что
#include <winsock.h>

ни на что не влияет.

С библиотеками разобрался (по крайней мере, оно компилируется), но не удается использовать setsockopt():
    int on = 1;
    setsockopt(tcpSocket->socketDescriptor(), IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));

дает ошибку вида "неверная конвертация int* в const char *". Кастую:
    int on = 1;
    setsockopt(tcpSocket->socketDescriptor(), IPPROTO_TCP, TCP_NODELAY, (const char *)&on, sizeof(on));

И получается: undefined reference to `setsockopt@20'. Так как использовать эту функцию?

Цитата(Алексей1153 @ 24.8.2012, 9:54) *
можно передавать исходное сообщение пакетами, скажем, по 2048 байтов. Тогда не будет ожидания доставки всего сообщения, только в приёмнике нужно будет собирать сообщение, учитывая свой протокол. Зато это можно сделать в отдельном потоке

Мне нужна быстрая реакция на каждый пакет. Ждать, пока сообщений по 5-10 байт наберется на два килобайта, не получится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 24.8.2012, 11:48
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ошибка побеждена добавлением
LIBS += -lws2_32

в проектный файл.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 24.8.2012, 12:31
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не уверен, что помогло и вообще в этом дело. Но не похоже, чтобы соединение стало работать быстрее. setsockopt() с обоих сторон возвращает ноль.

Выглядит это примерно так: вначале реакция быстрая, но со временем (или действиями) время отклика увеличивается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 24.8.2012, 12:36
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


из msdn - If no error occurs, setsockopt returns zero.

т.е. ноль это хорошо)

Выглядит это примерно так: вначале реакция быстрая, но со временем (или действиями) время отклика увеличивается.


подробнее ?

Сообщение отредактировал PAFOS - 24.8.2012, 12:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 24.8.2012, 13:15
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(PAFOS @ 24.8.2012, 12:36) *
ноль это хорошо

Знаю, это и имел в виду.

У клиента и у сервера есть по таймеру. Таймер запускается около 30 раз в секунду и запускает в числе прочего и отправку данных, но некоторые события отправляют информацию сразу же, при получении. Я сделал так, чтобы при нажатии Z отправлялся специальный пакет, содержащий количество прошедших тактов таймера клиента. В консоли сервера видно, что информация о нажатом Z сначала приходит мгновенно, но затем начинает запаздывать, все сильнее и сильнее.

Такое впечатление, что данные просто не успевают отправляться, поэтому "складируются" и постепенно тормозят передачу. Но тесты с iptraf на основном компе показывали, что обмен данными идет со скоростью около 40 кБ/с...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 24.8.2012, 13:20
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Так может быть проблема где-нибудь в коде?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 24.8.2012, 13:22
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


В каком смысле? Какой тип проблемы может приводить к этому?

Замена TCP на UDP (код передачи практически идентичен, остальное не меняется), к слову, полностью избавляет от задержек.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 24.8.2012, 13:39
Сообщение #18


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


ты применяешь setsockopt на сервере для QTcpSocket или для QTcpServer?

Сообщение отредактировал PAFOS - 24.8.2012, 13:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 24.8.2012, 15:06
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


int on = 1;
setsockopt(tcpSocket->socketDescriptor(), IPPROTO_TCP, TCP_NODELAY, (const char *)&on, sizeof(on));


Для сокета.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 24.8.2012, 15:18
Сообщение #20


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


сложно так сказать...
возьми wireshark и посмотри реально как пакеты шлются.... там можно настроить фильтр по IP:PORT TCP протокол. ведется логирование и т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 0:10