Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Ошибка при установке IP_TOS для IdTCPClient
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 22 сентября 2009 18:29
· Личное сообщение · #1

Использую IdTCPClient из Indy9. После коннекта пытаюсь изменить IP_TOS следующим образом:

Code:
  1. Var tos:byte;
  2. begin
  3. tos:=32;
  4. IdIOHandlerSocket1.Binding.SetSockOpt(IPPROTO_IP,IP_TOS,PChar(@TOS),Si zeOf(TOS));
  5. end;


Получаю ошибку Socket Error #10022 Invalid argument в то время как IdIOHandlerSocket1.Binding.SetSockOpt(SOL_SOCKET,SO_REUSEADDR,@B,SizeO f(Boolean)); проходит без проблем.
Переменная 1 байт, всё вроде сделал правильно... Не пойму почему ошибка.
Всё уходит в недры ws2_32 которая и возвращает ошибку...
В принципе вопрос в том, как поменять IP_TOS любым из несложных способов.
В запросах просил помощи и была идея пропатчить ws2_32 так, что бы параметр ip_tos в заголовке каждого отправляемого пакета принимал жестко заданное значение, например 1Dh.
Перехватывал send и sendto из этой библиотеки, там в буфере мои данные, но без заголовка. Заголовок добавляется в недрах, надеюсь этой dll а не драйвера... Как я понял подобную манипуляцию с TOS делает QoS служба... Для полного контроля над заголовком пакета нужно формировать его самостоятельно и работать с рав-сокетами, но хочется минимальными затратами заставить работать готовые приложения использующие компоненты Indy.
Буду очень благодарен за помощь!



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 22 сентября 2009 20:10
· Личное сообщение · #2

А что в других осях, в других делфях? В каких пробовал?



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 22 сентября 2009 21:05
· Личное сообщение · #3

вообщем интересно

SUMMARY
Microsoft Windows 2000, Microsoft Windows XP, and Microsoft Windows Server 2003 do not support the marking of Internet Protocol (IP) Type of Service (ToS) bits with the setsockopt function.

support.microsoft.com/kb/248611

а Indy зовет виндозную setsockopt()



Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 22 сентября 2009 21:07
· Личное сообщение · #4

ToBad пишет:
IdTCPClient из Indy9

На многих сайтах говорится, что инди9 кривое и что после установки 10й версии проблемы отпадают сами по себе




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 сентября 2009 00:15
· Личное сообщение · #5

_ruzmaz_ пишет:
А что в других осях, в других делфях? В каких пробовал?


Неа. Нет возможности, да и под эту ось мне нужно...

sendersu пишет:
Microsoft Windows 2000, Microsoft Windows XP, and Microsoft Windows Server 2003 do not support the marking of Internet Protocol (IP) Type of Service (ToS) bits with the setsockopt function.


Очень интересно. Почитав по ссылке нашёл инфу о параметре DisableUserTOSSetting. Вот что пишут:
С помощью службы Winsock и параметра сокета IP_TOS можно задавать значения поля DSCP для исходящих пакетов канала. Однако по умолчанию стековая память протокола TCP/IP игнорирует параметр сокета IP_TOS. Чтобы использовать параметр сокета IP_TOS, необходимо сначала создать DWORD-значение реестра DisableUserTOSSetting=0 в следующем разделе реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Буду испытывать...

sendersu пишет:
а Indy зовет виндозную setsockopt()


Да, он всё оттуда так или иначе вызывает...

s0l пишет:
На многих сайтах говорится, что инди9 кривое и что после установки 10й версии проблемы отпадают сами по себе


Спасибо за подсказку. Пытался на серверной части быстро перейти на 10-ку, но слишком много отличий. Хотя создать что-то новое для проверки установки TOS - хорошая идея, если будет работать - перепишу всё под Indy10.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 сентября 2009 14:33 · Поправил: ToBad
· Личное сообщение · #6

Разобрался!!!
Спасибо всем за участие и подсказки!

После того как в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters создаём DisableUserTOSSetting=0 - начинает срабатывать установка TOS тем способом который я описал в первом посте, либо так: IdTCPClient1.Socket.Binding.SetSockOpt(IPPROTO_IP,IP_TOS,PChar(@TOS),S izeOf(TOS));
Естественно это нужно делать после успешного коннекта.
Жаль, что после установки DisableUserTOSSetting нужна перезагрузка...


 eXeL@B —› Программирование —› Ошибка при установке IP_TOS для IdTCPClient
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати