- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
已解决
我对读取问题的解决方案是将代码移至处理程序,并使用 HDL_AFTER_READ 状态来处理 websocket 连接。将握手放入应答缓冲区后,返回 2 发送。此外,您可能想要更改 KALIVE_TMO,因为它指示在没有流量的情况下连接关闭的时间。我还没有完成整个 websocket 的事情,因为我似乎无法识别之后的连接(US_REQUEST_DATA 在这里不起作用),但这是一个不同的主题,我只在这里提到它,以便人们知道我为什么还没有更新我的代码。
--原始问题:
我目前正在尝试让 websockets 与 GWAN ( http://gwan.com/ ) 4.3.14 配合使用。到目前为止,我已经通过了与 firefox/chrome 的连接握手,但之后连接会在几秒钟后关闭。
我已经猜测为什么会发生这种情况,这可能是服务器缺少 PONG,但我现在的问题是,我不知道如何从 servlet 的客户端读取更多数据。我发现似乎可以从处理程序中做到这一点(至少根据手册,我发现该手册是错误/过时的几次),但似乎也有几种可能性使用我更喜欢的 servlet。
到目前为止我已经尝试过:- get_env(argv, HTTP_HEADERS) 的 file_fd 上使用 WK_FD 进行唤醒;无论我做什么,wake_up似乎都不起作用(尝试使用WK_MS,其值在1000到100000之间,没有区别-返回RC_NOHEADERS + RC_STREAMING后,servlet立即再次被调用)- get_env(argv, CLIENT_SOCKET) 上的接收;这里的recv告诉我,我正在操作的任何东西(值为0的int)都不是一个套接字(过去也从未让CLIENT_SOCKET工作过,我一定在那里做错了什么?)- 简单的 sleep(1)(最多 20)次调用 - READ_XBUF 之后没有新数据,即使客户端上的wireshark + 服务器上的 tcpdump 告诉我有数据从客户端传输到服务器
我过去也尝试过使用不同的处理程序状态返回 1 来“从客户端读取更多数据”(某些版本之前,所以也许这已经修复了 - 但正如所说,我更喜欢使用 servlet 的解决方案) 。这甚至不适用于简单的 ajax post 请求(大多数浏览器在使用 post 时在第二个 tcp 数据包中发送 post 数据,因此您最初不会通过 gwan 获得有效负载),所以也没有运气。
P.S:顺便说一句(据我所知,Gil 在这里回答了大多数(如果不是全部)与 gwan 相关的问题),我已经好几次想在 GWAN 网站上签署爱好者支持契约(Contract)了,但我还没有找到了如何通过初始价目表(在撰写本文时还没有欧元版本)。
我很乐意提供任何类型的代码来帮助解决这个问题,
非常感谢您抽出时间。
编辑:主函数的代码(我知道终止代码是错误的,所以请暂时忽略它,因为这也不是我在这里提问的原因)
printf("\n---------- RUN ---------\n");
xbuf_t *reply = get_reply(argv);
xbuf_t *request = (xbuf_t *)get_env(argv, READ_XBUF);
void **pdata = (void**)get_env(argv, US_REQUEST_DATA);
if (!pdata[0]) { // no request data yet, send upgrade to websocket
char *upgrade = xbuf_findstr(request, "\r\nUpgrade: websocket\r\n"); // FF only sends this ; chrome also sends "Connection: Upgrade\r\n" afterwards
if (upgrade != NULL) { // correct upgrade header found?
const char keyHeader[] ="\r\nSec-WebSocket-Key: ";
char *key = xbuf_findstr(request, (char *)keyHeader);
if (key != NULL && (key += sizeof(keyHeader) - 1) != NULL && (request->len - (u32)(key - request->ptr)) >= (u32)23) { // correct key header found? + sanity check
char websocketGUID[] = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // 8 + 4 + 4 + 4 + 12 = 32 + 4 bytes for '-' = 36
const char data[] = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: %20B\r\n\r\n";
// 36 + 24
char keyCompose[60];
strncpy(keyCompose, key, 24);
strncpy(keyCompose + 24, websocketGUID, 36);
u8 sha[20];
sha1_t ctx;
sha1_init(&ctx);
sha1_add(&ctx, (u8 *)keyCompose, 60);
sha1_end(&ctx, sha);
xbuf_xcat(reply, (char *)data, sha);
pdata[0] = (void*)1;
printf("Init.");
return RC_NOHEADERS + RC_STREAMING; // don't build headers automatically
}
}
} else { // websocket connection here
const unsigned char websocketTerm[2] = { 0x00, 0xFF }; // websocket close = opcode 0x8
printf("Streaming!\n"); // TODO: next find way to get next user input (best would be to only wake up on user input or if we have something to send?)
char *buf = alloca(2);
buf[0] = 0; buf[1] = 0;
pdata[0]++;
if ((int)(pdata[0]) >= 20) {
xbuf_ncat(reply, (char *)websocketTerm, 2);
printf("Fin.\n");
pdata[0] = 0; // cleanup
return RC_NOHEADERS;
}
return RC_NOHEADERS + RC_STREAMING;
}
xbuf_cat(reply, "test");
return 403;
最佳答案
G-WAN Servlet
显然不是实现网络协议(protocol)的最有效方法。
由于 websockets
破坏了 HTTP 协议(protocol),因此您应该使用 G-WAN Handler
。
G-WAN 协议(protocol)处理程序
专门用于此任务。该领域缺乏文档和示例,因为我们最近不得不关注基于 G-WAN 的应用程序。
关于c - 使用 websocket 的 GWAN 双向通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509154/
大多数语言都支持双向进程通信。例如,在 Python 中,我可以(草率地)执行以下操作: >>> from subprocess import * >>> p = Popen('nslookup',
致力于使用 C++ 在 arduino 和 PC (Win 7) 之间进行通信。使用 WriteFile 和 ReadFile 创建通信或简单地发送或接收数据没有问题。但是当我想以某种方式“协调”沟通
我们正在开发一个基于微服务的应用程序。它们将使用 Helm Package Manager 部署到 kubernetes,并且它们都存储了自己的存储库和 helm chart。以下是我们微服务的名称。
我正在开发一个大型 MVVM 应用程序。我为此使用了 MVVM 轻量级工具包。该应用程序就像一个带有后退和前进按钮的网络浏览器。主视图是一个用户控件。我在主视图用户控件中放置了后退和前进按钮。主视图又
我在 java 和 freepascal(lazarus) 应用程序之间的通信有问题。我使用套接字。它们正确连接。一切都很顺利,直到我想从一个应用程序向另一个应用程序发送一些东西。在java而不是“a
我已经使用客户端套接字和服务器套接字使用C#编写了群聊。 当我使用VS 2017在自己的PC中运行程序(服务器和客户端)时,客户端和服务器之间的通信工作正常。 当我在笔记本电脑中运行客户端程序,并在自
Kubernetes 中两个不同 Pod 之间的通信是如何发生的? 就我而言,我有两个 Pod:前端和后端,它们都有不同的容器。 我希望我的前端 pod 与后端 pod 通信,但我不想使用后端 pod
我正在尝试在浏览器中嵌入的 flash 实例与在 C# WinForms 应用程序中运行的 flash 实例之间进行通信...我收到一个编译错误,内容为: 1119 Access of possibl
鉴于网络上缺乏信息,请问一个问题:我要在 Android 中创建一个应用程序,使用一个数据库应用程序 rails 。为此,我需要一个手动 session 。所以如果有人准备好了示例/教程显示通信 an
我正在编写一个应用程序,它将通过 MySQL 数据库对用户进行身份验证。我已经用 Java (android) 编写了它,但现在正在移植到 Windows 手机。 PHP 文件使用 $get 然后回显
是否可以通过互联网在两个不同设备上的两个不同应用程序之间建立通信。我想从设备 A 上的应用程序点击一个设备 B 上的应用程序,然后从设备 B 上的应用程序获取数据到设备 A 上的应用程序。如果可能,如
这是脚本: 它被放置在其他网站上。 com 并显示一个 iframe。如果有人点击 iframe 中的某个内容,脚本应该将一个 div 写入 othersite 。 com. 所以我的问题是如何做到
你好我是 php 的新手,我用 c++ 编写了整个代码并想在 php 中使用这段代码。所以我为我的代码制作了 dll 以使用它。但是我不能在 php 中使用这个 dll,可以谁能给我完整的代码来使用
我确定之前已经有人问过(并回答过)此类问题,所以如果是这样,请将我链接到之前的讨论... 在 C++ 中,假设我有一个 ClassA 类型的对象,其中包含一个 ClassB 类型的私有(private
我正在尝试使用 ATmega32 进行串行通信。首先,我使用 RS232,使用 USB-to-RS232 建立使用串行终端的接收和传输(在我的例子中是 tera 术语)。无论我从串行终端 Atmega
我找不到适用于 Ruby 的 SSL 实现。 我的部分项目需要服务器和客户端之间的安全通信链接,我希望为此使用 SSL 以创建安全 session 。 谢谢 最佳答案 如果你使用 Ruby 1.9.x
我正在尝试在客户端/服务器之间进行 SSL 通信。 到目前为止,我已经从 keystore 创建了 java.security.cert.X509Certificate。接下来我应该怎么做才能使这次沟
我在与 Windows 上的 USB 设备 通信时遇到问题。我不能使用 libusb 或 WinUSB,因为我有一个特定的驱动程序(Silabs USB 到 UART,这是一个 USB 到串口的桥接器
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我发现 xcom 实际上是将数据写入数据库并从其他任务中提取数据。我的数据集很大,将其腌制并写入数据库会导致一些不必要的延迟。有没有办法在不使用 xcom 的情况下在同一 Airflow Dag 中的
我是一名优秀的程序员,十分优秀!