【问题标题】:WebSocket server, connection forcibly closed by the remote hostWebSocket服务器,连接被远程主机强行关闭
【发布时间】:2012-01-18 17:20:36
【问题描述】:

我正在使用 C# WebSocket 服务器(目前由 https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-17 支持)。 服务器与 .NET 的 Socket 对象一起工作,以便服务器监听并让每个客户端发送和接收消息。

我建立了一个连接到服务器的网络客户端,它可以连接成功,我可以在客户端之间发送消息。

一切都很好!

现在,如果我连接到服务器并离开客户端一段时间没有发送消息,服务器会抛出异常:

Int32 Send(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags):An 现有连接被远程主机强行关闭。

异常,正如您所看到的,来自服务器中客户端套接字的 Send 方法,这看起来很连线,因为我没有从客户端发送任何数据,也没有人向该客户端发送数据,所以如何难道是Send方法可以抛出异常,为什么会抛出这个异常?

【问题讨论】:

  • 您可以发布发送代码(特别是引发异常的行)吗?
  • ...另外,您知道 .Net4.5 将直接支持 WebSockets 吗?
  • 是的,我知道 .Net 4.5 中的 WebSocket,但我不知道它什么时候发布。
  • 并且抛出异常的行是:this.clientSocket.Send(sendData.ToArray());另一个被抛出:this.clientSocket.EndReceive(_result);正如我所说,我没有发送任何数据...

标签: c# .net websocket


【解决方案1】:

这叫超时!

WebSockets 只是 TCP/IP 原始套接字(.NET 中的Socket 类)的包装器 - 如果没有发送任何内容,则超时,并且没有任何东西可以保持连接处于活动状态。

AFAIK 目前 WebSocket API 没有很好地定义如何保持连接处于活动状态。我也遇到了同样的情况,不得不切换到使用 ping(空消息)来保持连接处于活动状态(我正在使用 Microsoft 套接字实现)。

如果您是 reinventing the wheel 的非最终规范,请记住,每次规范更改时您都必须不断地重新发明它。我特别选择使用 Microsoft 套接字预览,这样当它发布时,我几乎不必更改任何代码。我不在 IIS 中运行 - 我作为控制台应用程序运行,到目前为止它运行良好,但我的用户非常少。

注意:导致我发现这个问题的问题是,如果我发送 10 条消息而没有收到回复,那么连接就会关闭。我仍在研究为什么会这样 - 无论是 WebSockets 的错误/功能还是 Socket 类的功能。我可能达到了 65kb 的限制,但我的消息很小,我认为这不是原因。在测试您正在处理的任何内容时请注意这一点,因为它会给出与您遇到的相同的错误。

【讨论】:

    【解决方案2】:

    我假设您已经排除了服务器和客户端之间不同协议的使用(愚蠢的假设,但您永远不知道)。

    如果您的代码在没有事先从客户端接收的情况下到达 Send 方法,那么很明显服务器代码有问题。使用跟踪和/或日志来获取更多信息,即使对于 abc,例如进入等待接收、接收、接收、退出接收等。

    【讨论】:

    • “如果您的代码在没有事先从客户端接收的情况下到达发送方法,那么很明显服务器代码有问题”。我已经知道了......我所做的日志将我引导到我收到的错误消息......
    • 您可以像上面一样扩展您的 abc 日志记录。
    • 有一个很大的变化,错误摆在你面前,但你看不到它。它发生在所有人身上。如果您记录执行流程的每一步,您就会增加找到它的机会。记录(作为信息)您在第 x 行进入等待接收、在第 x+2 行接收、在第 x+4 行退出接收等......这可能看起来很傻,但大多数时候都是成功的。
    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2021-05-12
    相关资源
    最近更新 更多