除非收到另一条消息,否则Websocket客户端无法在握手后发送

时间:2013-06-06 19:53:03

标签: c# google-chrome websocket windows-xp

我已经在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()被注释掉。如果从XP机器运行Chrome,无论你如何从浏览器发送消息,都不会完成.Receive()。如果你在.Receive()之前启动一个线程,它会在x个时间后发出.Send(),一旦发生这个过程就会完成。

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

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

Protocol Documentation

API Documentation

1 个答案:

答案 0 :(得分:-1)

如果您正在编写新的WebSocket实现,可以查看AutobahnTestsuite

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

它被许多项目使用,并且是用于测试的某种“事实标准”。

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