c++ - Websocket 广播不工作

标签 c++ websocket poco server broadcast

我的 websocket 有问题。 我最近将我的服务器从 PHP 切换到 C++ 端,并使用了 POCO 库,我使用的正是这个脚本: WebSocketServer.cpp

对于 C++ 中的一个客户端,我使用了我在 stackoverflow 上找到的代码片段: WebSocketClient.cpp

我稍微修改了客户端,首先它会在我连接到服务器后立即发送一条默认消息。

我用我的主应用程序的更新功能包装了整个东西,我可以不断地接收消息:

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);

}

我现在已经编写了一个非常简单的 javascript 客户端,它在页面加载时初始化:

<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>

服务器日志包括两条消息:

C++ App: WebSocket connection established. Frame received (length=5, flags=0x81).

Javascript: WebSocket connection established. Frame received (length=3, flags=0x81).

但来自 C++ 应用程序的日志确实发送了连接消息并收到了它,但我没有从 js 客户端收到消息:

[Websocket] Connecting to websocket.
[Websocket] Send: hello
[Websocket] Recv: hello

为什么会这样? 服务器代码的片段不是直接将消息发送回所有客户端吗?

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);

代码有问题吗?

最佳答案

我无法重现环境,但我在使用 Python 和 IOS 网络套接字时遇到了类似的问题。我们使用的所有其他技术都可以完美地与 Python 套接字配合使用,但 IOS 网络套接字有问题。许多天后,我们发现 IOS web socket 不发送 Python 可以处理的通信端(EOM)。所以我们必须以不同的方式处理不同的 IOS 套接字。

我已经检查了 WebSocket 标志 81,所以它是文本并且框架已完成。但我建议您从浏览器的开发人员工具中查看从“网络”选项卡通过套接字连接收到的内容。

我可能是 javascript WebSocket 不理解消息结束的问题。如果您在开发人员工具上看到数据问候,那么就很容易处理这种情况。但是,如果您没有看到任何消息,那么问题很可能来自 C++ 代码。

在附件中,您可以看到 Chrome 如何显示套接字数据交易。请记住,单击左侧列表中的连接将更新它们不活跃的交易。

希望对您有所帮助。 enter image description here

如果不深入使用 tcpdump 或类似的软件来确定它们是否真的由双方发送和接收。

关于c++ - Websocket 广播不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27785785/

相关文章:

c++ - 在不使用数组的情况下找到 "n"数字之间的最大数字?

c++ - 如何有效地将 STL 容器恢复到旧值

websocket - 返回 django graphene 订阅中订阅事件的初始数据

asp.net-mvc - MetadataType 和 DataAnnotations 不起作用

reporting-services - 报告服务 : Business object data source with parent-child-grandchild

c++ - 未初始化的局部变量 c4700

c++ - 如何有条件地在C++中初始化对象

javascript - chrome webrequest api url 数组?

google-chrome - _webSocketTraffic 的 Chrome 开发工具 .har 文件有一个 "time"字段——这是什么意思?

c# - WCF、SOAP、EF、POCO