【问题标题】:Properly Handle "Connection reset by peer" in C#在 C# 中正确处理“由对等方重置连接”
【发布时间】:2012-08-03 19:03:48
【问题描述】:

我正在这里构建c# 示例https://github.com/coolaj86/fizzbuzz/blob/master/tcp-echo-csharp/Main.cs 并针对netcat 运行它。

当我使用 CTRL + C 退出 netcat 时,它会关闭套接字并得到

Unhandled Exception: System.Net.Sockets.SocketException: Connection reset by peer
  at System.Net.Sockets.Socket.EndReceive (IAsyncResult result) [0x00000] in <filename unknown>:0 
  at echo.AsynchronousSocketListener.ReadCallback (IAsyncResult ar) [0x00000] in <filename unknown>:0

在我使用的其他语言中,FIN 表示为读取 0 字节(或称为“FIN”或“结束”等的事件),但我修改了示例以打印出一条消息读取 0 个字节,我没有看到任何消息。

如何处理客户端关闭连接?

我正在寻找诸如“使用System.Net.Foo.Bar.CloseHandler()System.Net.Foo.Bar.ErrorHandler()”之类的答案。

【问题讨论】:

    标签: c# tcplistener


    【解决方案1】:

    我不确定,但我认为没有办法优雅地做到这一点。因为如果连接正确关闭,您会收到有关客户端断开连接的通知。但是通过 CTRL + C 中断程序执行不是这种情况。所以我建议你只处理异常来解决这个问题。

    【讨论】:

    • 这就是我要问的问题。我该如何处理异常? try/catch 或 Error 事件回调在哪里?附言netcat 使用 ctrl+c 优雅地退出。在其他语言中,我得到 end/fin/close/0-bytes-read 事件。
    • if (bytesRead > 0) { //recieved some data, work it out } else { //connection closed make a clean up } 这实际上是在您在问题中链接的代码中完成的。您可能会在 client.EndRecieve 遇到异常,因此请在此处设置 try/catch 块。
    • 有没有办法在调用 EndReceive 之前检查客户端是否仍然打开?还是客户端关闭时触发的回调?
    • 我认为没有,因此msdn.microsoft.com/en-us/library/w7wtt64b.aspx(见注释)如果你得到 SocketException,你应该检查 SocketException.ErrorCode。看看这个read.pudn.com/downloads135/sourcecode/internet/webserver/576119/…
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多