c++ - La difusión de Websocket no funciona
poco server (1)
Tengo un problema con mi websocket. Recientemente cambié mi servidor de PHP a C ++ y utilicé la biblioteca POCO, utilicé exactamente este script: WebSocketServer.cpp
Para el lado del cliente en c ++ usé un snipet que encontré aquí en stackoverflow: WebSocketClient.cpp
Modifiqué un poco el cliente, primero envía un mensaje predeterminado tan pronto como me conecto al servidor.
Envolví todo el asunto con una función de Actualización de mi aplicación principal, que constantemente puedo recibir mensajes:
void CLeagueStats :: Update( ) {
if(m_Connected) {
string msg = Recv( );
if(msg != "") {
//handleIncomingMsg( msg );
}
} else if(GetTime() - LastReconnectTime > 90 || LastReconnectTime == 0) {
Connect( );
}
}
string CLeagueStats :: Recv( ) {
char receiveBuff[256];
int flags=0;
int rlen=m_psock->receiveFrame(receiveBuff,256,flags);
CONSOLE_Print("Recv: "+string(receiveBuff));
return string(receiveBuff);
}
Ahora he escrito un cliente de JavaScript totalmente simple que se está iniciando en la carga de la página:
<script type="text/javascript">
var ip_port = ''localhost:9980'';
var ohc;
if (typeof (MozWebSocket) == ''function'')
ohc = new MozWebSocket(''ws://'' + ip_port);
else
ohc = new WebSocket(''ws://'' + ip_port);
var self = this;
setTimeout(function() {
self.ohc.send("hey");
}, 500);
</script>
El registro del servidor incluye ambos mensajes:
Aplicación C ++: conexión WebSocket establecida. Marco recibido (longitud = 5, banderas = 0x81).
Javascript: conexión de WebSocket establecida. Marco recibido (longitud = 3, banderas = 0x81).
Pero el registro de la aplicación C ++ envía el mensaje de conexión y lo recibe de nuevo, pero no recibo el mensaje del cliente js:
[Websocket] Connecting to websocket.
[Websocket] Send: hello
[Websocket] Recv: hello
¿Por qué sucede esto? ¿El fragmento de código del servidor no está enviando directamente el mensaje a todos los clientes?
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
app.logger().information(Poco::format("Frame received (length=%d, flags=0x%x).", n,unsigned(flags)));
ws.sendFrame(buffer, n, flags);
¿Hay algo mal con el código?
No soy una situación para reproducir el entorno, pero tuve un problema similar con los sockets web de Python e IOS. Todas las otras tecnologías que usamos estaban trabajando con Sockets de Python sin problemas, pero el socket web IOS tenía problemas. Después de muchos días, descubrimos que el socket web IOS no envía un ender de comunicación (EOM) que Python puede procesar. Entonces tuvimos que manejar diferentes tomas IOS diferentes.
He revisado las banderas de WebSocket 81, por lo que es texto y el cuadro está terminado. Pero le sugiero que compruebe desde las Herramientas del desarrollador del navegador para ver qué se recibe a través de la conexión de socket desde la pestaña de red.
Puedo ser un problema de fin de mensaje no entendido por javascript WebSocket. Si ve los datos hola en las herramientas de desarrollador, entonces sería fácil de manejar con la situación. Sin embargo, si no ve ningún mensaje, entonces el problema probablemente provenga del código C ++.
En el archivo adjunto puede ver cómo Chrome muestra las transacciones de datos del socket. Tenga en cuenta que al hacer clic en la conexión en la lista de la izquierda se actualizarán las transacciones que no están en vivo.
Espero que esto te ayude.
Si no es más profundo, use tcpdump o un software similar para asegurarse de que realmente se enviaron y obtuvieron por dos lados.