C# 如何区分套接字中的读错误和写错误?

C# 如何区分套接字中的读错误和写错误?,c#,sockets,tcp,C#,Sockets,Tcp,我正在为一个处理大量TCP连接的游戏创建一个服务器,我需要处理突然失去连接的pc崩溃、游戏进程中断、internet连接丢失等问题。我目前的问题是,我无法区分读错误和写错误,因为两者都会引发IOException。即使基础异常也是相同的SocketException,唯一的区别是一个异常发生在Socket.Send上,另一个异常发生在Socket.Receive上。我当然可以比较异常消息,但一旦系统语言发生变化,这将成为一个问题,老实说,这将是一个相当混乱的方法 我尝试比较Hresult,但由于

我正在为一个处理大量TCP连接的游戏创建一个服务器,我需要处理突然失去连接的pc崩溃、游戏进程中断、internet连接丢失等问题。我目前的问题是,我无法区分读错误和写错误,因为两者都会引发IOException。即使基础异常也是相同的SocketException,唯一的区别是一个异常发生在Socket.Send上,另一个异常发生在Socket.Receive上。我当然可以比较异常消息,但一旦系统语言发生变化,这将成为一个问题,老实说,这将是一个相当混乱的方法

我尝试比较Hresult,但由于基础异常是相同的,所以Hresult也是相同的。我也尝试过getHashCode,但这一个会随着玩家的不同而变化

我还能用其他方法区分这两种情况吗?
为了澄清,我们讨论的是在连接意外关闭的TcpClient上使用TcpClient.read或TcpClient.write时出现的异常。

您可以尝试将发送和接收函数包装在try-catch块中,并使用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"];
}

类型没有读写函数。tcp客户端的确切类型是什么?您可以捕获socket.send和socket.receive周围的IOException,并使用更具体的详细信息重新引发另一个异常,甚至处理那里的连接丢失。另外,请注意,只有在尝试套接字写入时才会发现一些常规错误。这并不意味着它们是写错误。@KernelMode我使用的是System.Net.Sockets.TcpClient,它的读写方法我弄乱了大小写,我的坏@ajg Socket.Send和Socket.Receive在TcpClient类中,我没有访问权限that@LastExceed你是说NetworkStream.Read/Write吗?通过TcpClient.GetStreamSocket.Send和socket.Receive访问网络流在TcpClient类内,我无权访问该类。请将其替换为NetworkStream.Read/Write,或者使用您已经在使用的任何方法来读/写数据。