如何区分套接字写入错误的读取错误?

时间:2017-07-14 09:59:07

标签: c# sockets tcp

我正在为一个处理大量TCP连接的游戏创建一个服务器,我需要处理突然断开连接(电脑死机,游戏进程死机,互联网连接丢失,ectect)。我目前遇到的问题是,由于两者都抛出IOException,因此我无法区分写入错误的读取错误。甚至基础异常都是相同的(SocketException),唯一的区别是一个异常分别出现在Socket.Send()而另一个出现在Socket.Receive()上。我当然可以比较异常消息,但只要系统语言发生变化就会成为一个问题(说实话,无论如何这都是一个非常混乱的方法)。

我尝试比较Hresult,但由于基础异常相同,Hresult也是如此。我也试过了getHashCode(),但这个因人而异。

我可以分辨出这两种情况吗? 为了澄清,我们正在讨论在TcpClient.read()上使用TcpClient.write()时出现的异常,该TcpClient的连接意外关闭。

1 个答案:

答案 0 :(得分:1)

您可以尝试在try-catch块中包装send和receive函数,并使用Data属性来告知读写异常:

enum ReadOrWrite { Read, Write }

void Foo()
{
    try
    {
        socket.Receive();
    }
    catch (IOException ex)
    {
        ex.Data.Add("readOrWrite", ReadOrWrite.Read);
        throw;
    }
}

这是你后来发现它的地方:

try
{
    Foo();
}
catch (IOException ex) when (ex.Data.Contains("readOrWrite"))
{
    var readOrWrite = ex.Data["readOrWrite"];
}