在 TcpClient 中设置 TCP_QUICKACK 选项

Jas*_*n C 5 c# sockets tcpclient

我正在将一些 C++ 移植到 C#。我正在努力寻找各种套接字选项的等效项。我无法弄清楚的是如何TCP_QUICKACK在 C# 中进行设置。

如果我有一个TcpClient,那么 C# 相当于:

optval = 1; 
setsockopt(socket_, IPPROTO_TCP, TCP_QUICKACK, &optval, sizeof(optval));
Run Code Online (Sandbox Code Playgroud)

在 中似乎没有等价物,在SocketOptionName中似乎也没有相应的属性TcpClient.Client

如何设置此选项?

Row*_*ith 1

我相信以下内容将实现这一目标,但您可能需要问自己是否真的需要禁用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);
Run Code Online (Sandbox Code Playgroud)

outputArray 将保持不变,且 bytesInputOutputArray 将为 0。

多年来我在很多地方看到 TCP_QUICKACK 在 Windows 上工作,尽管没有记录,但它的值是 12(与 Linux 相同)。但你不能从C#传递它,Socket.SetSocketOption不会接受它。

#define TCP_QUICKACK        12
Run Code Online (Sandbox Code Playgroud)

另一个未记录的选项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);
Run Code Online (Sandbox Code Playgroud)