在TcpClient中设置TCP_QUICKACK选项

问题描述 投票:2回答:1

我正在将一些C ++移植到C#。我在努力寻找各种套接字选项的等效项。我不知道的是如何在C#中设置TCP_QUICKACK

如果我有TcpClient,C#等效于什么:

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

SocketOptionName中没有似乎是等效的,TcpClient.Client中似乎也没有对应的属性。

如何设置此选项?

c# sockets tcpclient
1个回答
0
投票

我相信以下方法可以实现这一点,但是您可能需要问自己,您是否确实需要禁用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);
© www.soinside.com 2019 - 2024. All rights reserved.