我有使用Websocket的C ++程序代码。我使用的服务器端: recv(sSocket,szBufferTmp,99990,0)从客户端接收数据 当客户端发送的数据超出速度服务器可以读取的速度时,我的服务器在recv()函数中被阻止,数据仍在输入队列中。我使用recv(sSocket,szBufferTmp,99990,MSG_PEEK)测试并看到我的数据仍在输入队列中。为什么recv(sSocket,szBufferTmp,99990,0)不能读取数据但是recv(sSocket,szBufferTmp,99990,MSG_PEEK)是可能的?以及我该如何解决? 当客户端发送消息1,2,3时,我的错误相同。服务器收到1,2。客户端发送4->服务器收到3。5-> 4,...尽管数据仍在输入队列中,但它延迟了。我可以使用“ MSG_PEEK”来获取 这是我的代码:
Client is JavaScript:
> var m_cWebsocket = new WebSocket("Servername");
> if (m_cWebsocket == null) { return false; }
> m_cWebsocket.onopen = onWebsocketOpen(m_cWebsocket);
> m_cWebsocket.onmessage = onWebsocketMessage;
> m_cWebsocket.onerror = onWebsocketError;
> m_cWebsocket.onclose = onWebsocketError;
> I using m_cWebsocket.send(strMsg) to send data.
服务器:
同时(真) { recv(sSocket,szBufferTmp,99990,0);
// recv(sSocket,szBufferTmp,99990,MSG_PEEK); //一些过程 }
答案 0 :(得分:0)
应该是这种情况,当send()发送数据的速度超过recv()可以读取的速度时,它将阻塞 send(),直到服务器的recv()清除了管道,而不是recv()。
因此,如果您的服务器在客户端运行速度过快后阻止了recv,则可能发生以下情况:
Client sending data too fast, but pipe not full yet. Server receiving data.
Pipe fills up. Server->recv getting data. Client->send blocking.
Server->recv gets all the data while Client->send is still blocking.
Pipe empties out. Server->recv blocks until pipe is full again.
Client->send is still blocking, waiting for a signal to go check if the pipe is ready.
但是,您确实说过输入队列中仍然有数据。您没有说在哪里实现了所提到的msg_peek,但是假设您的工具正确实现,是否有可能缓冲区'szBufferTmp'已满,使用后没有清除,并且有一些逻辑可以防止覆盖什么时候吃饱了?
需要更多数据才能确定是否是这种情况。我们需要查看您的服务器和客户端代码,并且包括您的套接字调用,getaddrinfo调用和bind / listen / accept / connect调用的代码也无济于事。当然。