.net - 在 .NET 中进行保持事件套接字检查的最佳方法是什么?

标签 .net sockets

我正在寻找一种在 .NET 中进行保持事件检查的方法。该场景适用于 UDP 和 TCP。

目前在 TCP 中,我所做的是一侧连接,当没有数据要发送时,它每 X 秒发送一次保持事件状态。

我希望对方检查数据,如果在 X 秒内未收到数据,则引发事件等。

我尝试做的一种方法是执行阻塞接收并将套接字的 RecieveTimeout 设置为 X 秒。但问题是每当超时发生时,套接字的 Receive 就会抛出 SocketException 并且这一侧的套接字将关闭,这是正确的行为吗?为什么套接字在超时后关闭/死亡而不是继续运行?

检查是否有数据和 sleep 是 Not Acceptable (因为我在 sleep 时接收数据可能会滞后)。

那么解决这个问题的最佳方法是什么,为什么我在另一边描述的方法失败了?

最佳答案

如果您的字面意思是“KeepAlive”,请尝试以下操作。

    public static void SetTcpKeepAlive(Socket socket, uint keepaliveTime, uint keepaliveInterval)
    {
        /* the native structure
        struct tcp_keepalive {
        ULONG onoff;
        ULONG keepalivetime;
        ULONG keepaliveinterval;
        };
        */

        // marshal the equivalent of the native structure into a byte array
        uint dummy = 0;
        byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
        BitConverter.GetBytes((uint)(keepaliveTime)).CopyTo(inOptionValues, 0);
        BitConverter.GetBytes((uint)keepaliveTime).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
        BitConverter.GetBytes((uint)keepaliveInterval).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);

        // write SIO_VALS to Socket IOControl
        socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
    }

请注意时间单位为毫秒。

关于.net - 在 .NET 中进行保持事件套接字检查的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/169170/

相关文章:

c - 在TCP套接字程序中,客户端发送一些数据,但服务器需要多次读取。为什么?

c# - 使用不同用户名的 Processstartinfo 时隐藏控制台窗口

.net - HashSet<T> 与 Dictionary<K, V> 相对于查找项目是否存在的搜索时间

.net - 如何清除连接字符串的配置管理器缓存

c# - 如果字符串在 .NET 中是不可变的,那么为什么 Substring 需要 O(n) 时间?

java - 套接字镜像发送但不接收

Java 为新连接重新打开 ServerSocket

php - stream socket client persistent 保持打开多长时间以及如何确认没有重复连接

java - 使用一个套接字创建 2 个流

c# - 将 List<Object> 转换为 ObservableCollection<Object> 的最佳方式