不要从输入队列套接字读取数据

时间:2018-09-10 03:59:40

标签: c++ sockets websocket

我有使用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); //一些过程     }

  

1 个答案:

答案 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调用的代码也无济于事。当然。