【问题标题】:Set TCP_QUICKACK option in TcpClient在 TcpClient 中设置 TCP_QUICKACK 选项
【发布时间】:2020-01-19 06:07:36
【问题描述】:

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

如果我有一个TcpClient,C# 的等价物是什么:

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

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

如何设置此选项?

【问题讨论】:

  • 这是一个请求但未实现的功能。见this

标签: c# sockets tcpclient


【解决方案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);

outputArray 不变,bytesInOutputArray 为 0。

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

#define TCP_QUICKACK        12

另一个未记录的选项是 SIO_TCP_SET_ACK_FREQUENCY apparently 将频率设置为 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);

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2017-12-11
    相关资源
    最近更新 更多