C ++ отключить отложенное подтверждение в Windows - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь реплицировать приложение реального времени на компьютер с Windows, чтобы иметь возможность отлаживать и вносить изменения, но я столкнулся с проблемой с задержкой подтверждения.Я уже отключил Nagle и подтвердил, что он немного улучшил скорость.При отправке большого количества маленьких пакетов, окно не сразу подтверждает и задерживает его на 200 мс.Проводя дополнительные исследования, я наткнулся на этот .Проблема с изменением значения реестра заключается в том, что это повлияет на всю систему, а не только на приложение, с которым я работаю.Есть ли в любом случае отключить отложенный ACK в оконной системе, как TCP_QUICKACK из Linux, используя setsockopt?Я пробовал жестко запрограммировать 12, но получил WSAEINVAL от WSAGetLastError.

Я видел разработчика на github, в котором упоминалось использование SIO_TCP_SET_ACK_FREQUENCY, но я не видел ни одного примера того, как его использовать.

Итак, я попытался сделать ниже

#define SIO_TCP_SET_ACK_FREQUENCY _WSAIOW(IOC_VENDOR,23) 
result = WSAIoctl(sock, SIO_TCP_SET_ACK_FREQUENCY, 0, 0, info, sizeof(info), &bytes, 0, 0);

и получил WSAEFAULT в качестве кода ошибки.Пожалуйста, помогите!

1 Ответ

2 голосов
/ 07 марта 2019

Я видел несколько ссылок в Интернете, что TCP_QUICKACK может фактически поддерживаться Winsock через setsockopt() (опция 12), даже если это НЕ задокументировано или официально подтверждено где-либо.

Но, что касается вашего фактического вопроса, вы используете SIO_TCP_SET_ACK_FREQUENCY неудачно, потому что вы не предоставляете входной буфер для WSAIoctl() для установки фактического значения частоты. Попробуйте что-то вроде этого:

int freq = 1; // can be 1..255, default is 2
result = WSAIoctl(sock, SIO_TCP_SET_ACK_FREQUENCY, &freq, sizeof(freq), NULL, 0, &bytes, NULL, NULL);

Обратите внимание, что SIO_TCP_SET_ACK_FREQUENCY доступен в Windows 7 / Server 2008 R2 и более поздних версиях.

...