我正在为一个处理大量TCP连接的游戏创建一个服务器,我需要处理突然断开连接(电脑死机,游戏进程死机,互联网连接丢失,ectect)。我目前遇到的问题是,由于两者都抛出IOException
,因此我无法区分写入错误的读取错误。甚至基础异常都是相同的(SocketException
),唯一的区别是一个异常分别出现在Socket.Send()
而另一个出现在Socket.Receive()
上。我当然可以比较异常消息,但只要系统语言发生变化就会成为一个问题(说实话,无论如何这都是一个非常混乱的方法)。
我尝试比较Hresult
,但由于基础异常相同,Hresult
也是如此。我也试过了getHashCode()
,但这个因人而异。
我可以分辨出这两种情况吗?
为了澄清,我们正在讨论在TcpClient.read()
上使用TcpClient.write()
时出现的异常,该TcpClient
的连接意外关闭。
答案 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"];
}