我正在努力更好地理解服务器端架构如何为WebSockets工作,目标是在嵌入式应用程序中实现它.似乎这里有3种不同的服务器端软件组件:1)服务于静态HTTP页面和处理升级请求的Web服务器,2)用于处理WebSockets通信"细节"的WebSockets库,如libwebsockets ,3)我的自定义应用程序,以实际弄清楚如何处理传入的数据.这些如何组合在一起?是否有一个单独的Web服务器和WebSocket处理部分,即WebSocket服务器/守护程序?
我的应用程序如何与Web服务器和/或WebSockets库通信以发送/接收数据?例如,使用CGI,Web服务器使用环境变量将信息发送到自定义应用程序,使用stdout接收响应.这里的等效通信系统是什么?或者您通常将WebSocket库链接到客户应用程序中?但那么如何与Web服务器通信到WebSocket库+自定义应用程序呢?或者所有3个组合成一个组件?
这就是我要问的原因.我在具有有限内存的Blackfin处理器上的uClinux/no MMU平台上使用boa Web服务器.boa中没有本机WebSocket支持,只有CGI.我试图找出如何添加WebSockets支持.我更喜欢使用编译的解决方案,而不是像JavaScript,Python或PHP这样的解释.我当前的应用程序使用CGI的长轮询,这不能为计划的增强提供足够的性能.
我试图找到一个例子,它将解释我如何使用libwebsocket实现Client,但我没有得到任何令人信服的代码.有什么链接我可以参考吗?
我正在尝试在我的ubuntu中安装libwebsocket.
所以我下载了项目https://github.com/warmcat/libwebsockets解 压缩它,我按照安装说明.
我键入命令cmake FH并获取以下消息.
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:State or Province Name …
Run Code Online (Sandbox Code Playgroud) 我有一个通过 WebSockets 连接到服务的网络应用程序。此应用在桌面版 Chrome/Firefox 中运行良好,但移动版 Chrome 出现错误:
WebSocket 连接到“ws://192.168.0.11:8080/”失败:一个或多个保留位打开:reserved1 = 0,reserved2 = 1,reserved3 = 0
服务器使用最新版本的libwebsockets。
此错误发生在初始连接期间,随后通过多个 2048 字节帧将中等大的 JSON 数据堆发送到客户端。
服务器公开了几个不同的 WebSocket。其中一些也以其他方式失败:
无法将文本框架解码为 UTF-8。
...和...
无法识别的帧操作码:6
一种预测哪些应该失败,哪些应该成功的模式尚未显露出来。
我怀疑这里存在某种框架问题。我已经查看了 WireShark 中的消息,在我看来它们是正确的。标题似乎是正确的。
为什么这会在桌面 Chrome/Firefox 中工作,但在 Android 版 Chrome 中失败?
我正在尝试在我的项目中在CLion中构建libwebsockets.在构建期间,libwebsockets会创建其他文件所需的头文件,并将其放在PROJECT_BINARY_DIR中.CLion在为项目创建的随机构建目录中构建所有内容,并且头文件最终在该目录中.我试过了:
这些都不起作用,这引出了我的问题:
我使用libwebsocket在C ++中实现了一个websocket客户端。
我想发送大消息,但我将消息有效负载限制为8K,我需要使用该有效负载值。
这是我的初始化代码的片段:
void
WSManager::initProtocols(void)
{
memset(protocols, 0, sizeof(protocols));
protocols[0].name = "default";
protocols[0].callback = callback;
protocols[0].per_session_data_size = 1500;
protocols[0].rx_buffer_size = 8000;
/* End of the list */
protocols[1].name = NULL;
protocols[1].callback = NULL;
protocols[1].per_session_data_size = 0;
protocols[1].rx_buffer_size = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何发送大于8K的消息。
有没有一种方法可以缓冲数据,或者我必须使用fraggle?
有一个很棒的答案,详细介绍了 REST api 的工作原理。
Websocket 如何以类似的细节工作?
websocket socket.io spring-websocket libwebsockets java-websocket
我试图让 libwebsockets 在 OS X 上的多线程环境中运行。我无法触发从与主服务线程不同的线程发送数据。在 libwebsocket 文档上暗示这应该是可能的(演示代码,邮件列表)。于是我深入研究代码,发现问题出在 poll() 函数中。
struct pollfd
对于作为参数给出的参数,poll() 的行为似乎有所不同。libwebsockets 依赖于在 poll() 处于活动状态时更改 fds.event 字段的可能性。这在 Linux 上运行良好,但在 OS X 上不起作用。
我编写了一个小测试程序来演示该行为:
#include <unistd.h>
#include <netdb.h>
#include <poll.h>
#include <iostream>
#include <thread>
#define PORT "3490"
struct pollfd fds[1];
bool connected = false;
void main_loop() {
int sockfd, new_fd;
struct addrinfo hints, *servinfo, *p;
socklen_t sin_size;
int yes=1;
char s[INET6_ADDRSTRLEN];
int rv;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = …
Run Code Online (Sandbox Code Playgroud) 如何在 libwebsockets 回调中设置用户自定义指针?
我在 lws_protocol 中添加了一个指针变量。
当回调函数被调用时,用户指针始终为NULL。
我使用 libwebsockets v3.0。
static int interrupted, rx_seen, test;
int ws_callback(struct lws *ws, enum lws_callback_reasons reason, void *user, void *in, size_t len) {
// user is NULL
return lws_callback_http_dummy(ws, reason, user, in, len);
}
int main() {
struct lws *ws;
struct lws_context_creation_info context_info;
struct lws_client_connect_info client_info;
struct lws_context *context;
struct lws_protocols protocols[] = {
{ "ws_callback", ws_callback, 0, 0, 0, POINTER_VARIABLE /* HERE */, 0 }
};
int n = 0;
// context creation …
Run Code Online (Sandbox Code Playgroud) 我有libwebsocket客户端发送二进制数据.我已将二进制数据保存到缓冲区[即buf]并写入套接字.
n = libwebsocket_write(wsi,
&buf[LWS_SEND_BUFFER_PRE_PADDING], l, opts | LWS_WRITE_BINARY);
Run Code Online (Sandbox Code Playgroud)
我的问题是socket只能写22392个字节[因为我收到了n = 22392].当我的l> = 22392字节时,它被注意为部分写入.此值因各种体系结构而异.
题:
libwebsocket中的数据大小是否有限制?
有什么方法可以扩展缓冲区的有效负载值
在Google Chrome上执行mqttws31.js作为HTML文件的一部分时,我遇到以下错误.
HiveMQ用作MQTT代理,日志如下
2014-10-28 14:46:45,043 INFO - HiveMQ home directory: E:\hivemq-2.1.0
2014-10-28 14:46:45,065 INFO - Starting HiveMQ Server
2014-10-28 14:46:48,249 WARN - No license file found. Using free personal licensing with restrictions to 25 connections.
2014-10-28 14:46:48,367 INFO - Activating statistics callbacks with an interval of 60 seconds
2014-10-28 14:46:48,368 INFO - Activating $SYS topics with an interval of 60 seconds
2014-10-28 14:46:48,728 INFO - Starting on address 127.0.0.1 and port 1883
2014-10-28 14:46:48,734 INFO - Started HiveMQ 2.1.0 in …
Run Code Online (Sandbox Code Playgroud) libwebsockets ×11
c ×4
websocket ×4
linux ×2
c++ ×1
clion ×1
cmake ×1
hivemq ×1
installation ×1
macos ×1
mqtt ×1
networking ×1
paho ×1
socket.io ×1
sockets ×1