WebSocket服务器,连接被远程主机强制关闭
本文关键字:主机 服务器 连接 程主机 WebSocket | 更新日期: 2023-09-27 18:17:31
我正在开发一个c# WebSocket服务器(目前由https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-17支持)。服务器正在与。net的Socket对象一起工作,以便服务器侦听和每个客户端发送和接收消息。
我建立了一个web客户端连接到服务器,它可以成功连接,我可以在客户端之间发送消息。
一切都很好!
现在,如果我连接到服务器,离开客户端一段时间没有发送消息,服务器抛出一个异常,说:
Int32 Send(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags):An已存在的连接被远程主机强制关闭。
异常,正如你所看到的是来自服务器端套接字的Send方法,这看起来很奇怪,因为我没有从客户端发送任何数据,也没有人向这个客户端发送数据,所以Send方法怎么可能抛出异常,为什么抛出这个异常?
这叫超时!
WebSockets只是TCP/IP原始套接字(. net中的套接字类)的包装-如果没有发送任何内容,并且没有任何内容保持连接存活,则会超时。
据我所知,目前WebSocket API并没有很好地定义如何保持连接存活。我也有同样的经历,不得不切换到使用ping(空消息)来保持连接存活(我使用微软套接字实现)。
如果你在为一个非最终规格重新发明轮子,只要记住每次规格改变时你都必须重新发明它。我特意选择使用微软的套接字预览版,这样当它发布的时候,我几乎不需要修改任何代码。我没有在IIS中运行——我是作为一个控制台应用程序运行的,到目前为止它工作得很好,但是我的用户非常非常少。
注意:我遇到的问题导致我发现这个问题是,如果我发送10条消息而没有收到回复,那么连接是关闭的。我还在研究为什么会这样——是WebSockets的bug/特性,还是Socket类的特性。我可能达到了65kb的限制,但我的消息很小,我不认为这是原因。在测试你正在做的任何东西时要注意这一点,因为它会给出与你得到的相同的错误。
我假设您已经排除了服务器和客户端之间不同协议的使用(愚蠢的假设,但你永远不会知道)。
如果您的代码到达Send方法时没有事先从客户机接收,那么很明显服务器代码出了问题。使用跟踪和/或日志来获取更多的信息,甚至对于abc,如输入等待接收,接收,接收,退出接收等