Установить параметр TCP_QUICKACK в TcpClient - PullRequest
4 голосов
/ 17 января 2020

Я портирую немного C ++ на C#. Я немного пытаюсь найти эквиваленты для различных опций сокетов. Я не могу понять, как установить TCP_QUICKACK в C#.

Если у меня есть TcpClient, то, что эквивалентно C#:

optval = 1; 
setsockopt(socket_, IPPROTO_TCP, TCP_QUICKACK, &optval, sizeof(optval));

Нет , кажется эквивалента в SocketOptionName, и, похоже, в TcpClient.Client нет соответствующего свойства.

Как установить этот параметр?

1 Ответ

0 голосов
/ 18 января 2020

Я верю, что следующее достигнет этого, но вы, вероятно, должны спросить себя, действительно ли вам нужно отключить TCP Delayed Acknowledgement. Возможно, вы обнаружите, что приложение будет работать без него.

// Disable TCP Delayed Acknowledgement on a socket
int SIO_TCP_SET_ACK_FREQUENCY = unchecked((int)0x98000017);
var outputArray = new byte[128];
var bytesInOutputArray = tcpClient.Client.IOControl(SIO_TCP_SET_ACK_FREQUENCY,BitConverter.GetBytes(1), outputArray);

outputArray останется неизменным, а значение bytesInOutputArray будет равно 0.

За многие годы я видел в некоторых местах, что TCP_QUICKACK работает на Windows, хотя и без документов, его значение равно 12 (так же, как Linux). Но вы не можете передать его из C#, Socket.SetSocketOption не примет его.

#define TCP_QUICKACK        12

Другой недокументированный параметр - SIO_TCP_SET_ACK_FREQUENCY , по-видимому , устанавливающий частоту в значение из 1 отключает задержанное подтверждение TCP.

C ++ хотел бы это

    #define SIO_TCP_SET_ACK_FREQUENCY _WSAIOW(IOC_VENDOR,23) 
    result = WSAIoctl(socket, SIO_TCP_SET_ACK_FREQUENCY, &frequency, sizeof(frequency), NULL, 0, &bytes, NULL, NULL);
...