.net - 在 .NET 中关闭另一端时如何关闭 TcpClient?

标签 .net tcpclient

我有一个处理 TcpClient 的类。该类应该做的是:

    while the other end has not done a graceful close or we are stopping
    {
        receive a request
        process it
        send response
    }

因为我不知道其他客户端何时会发送请求,所以我无法在设置超时的情况下进行读取,所以到目前为止我所拥有的是:

    While Not Me.Stopping()
        Try
            If tcpClient.Available >= My.Settings.minimumModBusTcpFrameSize Then
                processer = New MessageProcesser(Me, tcpClient)
                processer.ProcessMessage()
            End If
        Catch ex As TimeoutException
            ''#Do not nothing, the current message will timeout on origin too.
        End Try
    End While

这种方法的问题是我永远不知道客户端何时对 Close() 进行了远程调用。

有没有办法解决这个问题?

最佳答案

我不明白为什么你不能执行超时的 Read...如果读取超时你可以重试,而如果 Read 返回0 则连接已关闭。

编辑:是的,我已经确认了此处的行为 - 进一步阅读似乎确实失败了。这真的很奇怪...我将在这里留下我的答案,因为我认为应该是合适的 - 希望在某个时候我有时间再次调查它。

关于.net - 在 .NET 中关闭另一端时如何关闭 TcpClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973956/

相关文章:

c# - 具有多态 DataContracts 的 REST - 反序列化失败

c# - 为什么 ASP.NET 编译器会在每次构建时重建所有二进制文件?

c# - 动态 PropertyGrid 属性

c# - TCPClient 似乎不保持连接,为什么?

c# - 如何在C#中从sslstream获取端口号

C# TCPClient 流问题

.net - MySQL .NET Connector 文档困惑

c++ - 段错误 - 通过服务器将对象发送到客户端

c# - 如何保证NetworkStream在不关闭Stream或TcpClient的情况下立即发送数据?

c# - 用另一台电脑调用一台电脑(Dial up Modem)