【发布时间】:2014-08-30 13:43:51
【问题描述】:
我正在编写一个服务,该服务需要与远程服务器保持长期运行的 SSL 连接。我需要这台服务器进行自我修复,也就是说,如果它因任何原因断开连接,那么下次写入它时会重新连接。我试过这个:
bool isConnected = client.Connected && client.Client.Poll(0, SelectMode.SelectWrite) && stream.CanWrite;
if (!isConnected )
{
this.connected = false;
GetConnection();
}
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
但我发现它并没有像我预期的那样运行。如果我通过禁用 wifi 来模拟网络中断,我仍然可以使用 stream.Write() 写入流大约 20 秒。然后下次我尝试写入它时,client.Connected、client.Client.Poll() 或 stream.CanWrite() 都没有返回 false,但是当我去写入流时,我得到一个套接字异常。最后,如果我尝试重新创建连接,我会得到这个异常:一个现有的连接被远程主机强行关闭。
如果能帮助我创建一个可以承受网络故障的长时间运行的 SslStream,我将不胜感激。谢谢!
【问题讨论】:
-
你必须使用 SslStream,你能使用像 WCF 这样的更高层抽象,它内置了这些健壮性功能吗?
-
我不拥有等式的服务器端,所以我不能更改为 SSL 以外的任何东西。
-
当连接被切断时,你不知道收到了什么,没有收到什么。重启会比你想象的更难。 TCP 不保留消息边界。
标签: c# .net networking