2012-08-06 86 views
3

我在这里构建了c#示例https://github.com/coolaj86/fizzbuzz/blob/master/tcp-echo-csharp/Main.cs并针对netcat运行它。在C#中正确处理“通过对等方重置连接”

当我与CTRL退出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'或'end'的事件等),但是我修改了这个例子来打印出一个0字节的消息,我看不到消息。

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

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

回答

1

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

+0

这就是我问的问题。我如何处理异常? try/catch或Error事件回调在哪里? P.S. netcat用ctrl + c正常退出。在其他语言中,我得到了结束/ fin/close/0-bytes-read事件。 – CoolAJ86 2012-08-06 20:29:39

+0

如果(bytesRead> 0){// 收到了一些资料,做出来 } 其他 {// 连接关闭进行清理 } 这是你在你的问题链接的代码实际上做。你可以在client.EndRecieve得到一个异常,所以在这里做一个try/catch块。 – dantix 2012-08-06 20:43:31

+0

有没有办法在调用EndReceive之前检查客户端是否仍然打开?或者客户关闭时触发的回调? – CoolAJ86 2012-08-06 21:53:22

相关问题