0

我已经在 C# Websocket 服务器上工作了一段时间,并且有一个问题我已经解决但从未解决或找到它存在的适当理由。

我测试的环境在过去一年左右的 Windows XP 和 Windows 7 上的一系列版本中一直使用谷歌的 Chrome 浏览器。我的服务器也已经在这两个操作系统上进行了测试。

我注意到的问题仅在浏览器在 Windows XP 下运行时发生。Websocket 握手完成后,浏览器/客户端无法向服务器发送数据,除非先从服务器向客户端发送消息。

我所做的只是将 Ping 帧标记到服务器握手的末尾,并且所有功能都符合预期。我也测试过其他帧,只要服务器发送消息,客户端就会正常进行。

来自服务器的消息也不需要是即时的。如果客户端尝试发送消息,它可以无限期地等待。一旦服务器向客户端发送消息,客户端就会继续。

现在,我想我在我的 Websocket 服务器上做错了什么,但如果是这种情况,那么当浏览器在 Windows 7 下运行时,为什么一切都按预期工作。我不需要在之前向客户端发送消息客户端将向服务器发布消息。

作为一个非常基本的示例,如果 Chrome 从 XP 机器连接,这里的服务器代码永远不会完成;

byte[] textPound = {0x81, 0x01, 0x23};

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 56100);
server.Bind(ip);
server.Listen(100);

byte[] buffer = new byte[1000];

Socket client = server.Accept();
int rec = client.Receive(buffer);
Handshake(buffer, ref rec);//custom function returns the handshake to the buffer
client.Send(buffer, rec, SocketFlags.None);

//client.Send(textPound);
rec = client.Receive(b);
client.Close();

只要 .Send() 被注释掉,如果 Chrome 是从 XP 机器上运行的,无论您如何从浏览器发送消息,.Receive() 就永远不会完成。如果您要在 .Receive() 之前启动一个线程,该线程会在 x 时间后发出 .Send() ,那么一旦发生这种情况,该过程就会完成。

有没有人经历过这种情况,或者知道为什么会这样?

编辑——对于那些不知道 WebSocket 协议是什么的人;

协议文档

API 文档

4

1 回答 1

-1

如果你正在编写一个新的 WebSocket 实现,你可以看看AutobahnTestsuite

AutobahnTestsuite 提供了一个完全自动化的测试套件来验证 WebSocket 协议的客户端和服务器实现的规范一致性和实现的稳健性。

它被数十个项目使用,并且是某种用于测试的“事实上的标准”。

披露:我是 Autobahn 的原作者,为 Tavendo 工作。

于 2013-06-08T09:06:22.700 回答