2017-07-14 29 views
0

我正在为一款处理大量TCP连接的游戏创建一个服务器,并且我需要处理突然失去的连接(PC崩溃,游戏进程死亡,互联网连接丢失,保护)。我现在遇到的问题是,我无法分辨出写入错误的读取错误,因为两者都抛出了IOException。即使潜在的例外是相同的(SocketException),唯一的区别是分别发生在Socket.Send()Socket.Receive()上。当然,我可以比较异常消息,但只要系统语言发生变化就会成为问题(并且说实话,无论如何这将是一个相当混乱的方法)。如何区分套接字中写入错误的读取错误?

我试过比较Hresult,但由于底层的例外情况相同,因此Hresult也是如此。我也试过getHashCode(),但是这个从玩家变成玩家。

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

+0

['TcpClient'](https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v = vs.110)的.aspx)类型没有'read()'和'write()'函数。什么是tcp客户端的确切类型? – KernelMode

+1

你可以在socket.send和socket.receive两处捕获IOException,并用更多的具体细节重新抛出另一个异常,甚至处理丢失的连接。 – ajg

+0

另请注意,只有在套接字写入尝试中才会发现一些常规错误。这并不意味着他们是“写”错误。 –

回答

1

你可以尝试包裹发送,并在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"]; 
} 
+0

'Socket.Send()'和'socket.Receive()'在TcpClient类中,我无权访问 – LastExceed

+0

将其替换为NetworkStream.Read/Write ,或者你已经用来读/写数据的任何方法。 – AstroRP

相关问题