我已经在 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 协议是什么的人;