![]() |
eXeL@B —› Программирование —› Ошибка при установке IP_TOS для IdTCPClient |
Посл.ответ | Сообщение |
|
Создано: 22 сентября 2009 18:29 · Личное сообщение · #1 Использую IdTCPClient из Indy9. После коннекта пытаюсь изменить IP_TOS следующим образом: Code:
Получаю ошибку 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. Буду очень благодарен за помощь! ![]() |
|
Создано: 22 сентября 2009 20:10 · Личное сообщение · #2 |
|
Создано: 22 сентября 2009 21:05 · Личное сообщение · #3 |
|
Создано: 22 сентября 2009 21:07 · Личное сообщение · #4 |
|
Создано: 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. ![]() |
|
Создано: 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 |