1

解决方案:

int session = (int)get_env(argv, SESSION_ID);获取连接 US_VHOST_DATA(vhost)或US_HANDLER_DATA(侦听器)或US_SERVER_DATA(服务器)唯一的标识符,用于数据持久>当前连接

缺失的部分:

  • 仅用于连接的持久数据
  • 或者当当前连接被客户端(econnreset 等)或服务器(例如 kalive_tmo 到达)关闭时执行代码的某种方式

一旦添加了处理程序的新 HDL_BEFORE_CLOSE 状态,这应该可以解决,这使我回答了这个问题。


原始问题:

是否可以在 G-WAN 处理程序中将信息持久存储到请求/连接(不知道“请求”是否适用于此)?

为了更好地说明我的意思,这就是我现在得到的:

  • 客户端(浏览器、javascript)发送 websocket 握手
  • 处理程序启动,进入:
    • HDL_AFTER_ACCEPT - 在这里我为 US_REQUEST_DATA 调用 gc_init,并且没有错误
    • HDL_AFTER_READ - 这里我检查尚未设置的 US_REQUEST_DATA,所以我进行 websocket 握手和 gc_malloc + 设置 US_REQUEST_DATA,增加 KALIVE_TMO,然后返回 2 发送数据
  • 客户端看到 websocket 连接已建立,所以我(几秒钟后手动触发)发送一条消息
  • 处理程序再次转到 HDL_AFTER_READ,但未设置 US_REQUEST_DATA

我也尝试过:在 HDL_AFTER_READ 中返回 1 而不是 2 -> 客户端得到 404 并且握手不起作用

目前我只使用 US_REQUEST_DATA 来确定 websocket 连接是否已经建立并且下一个传入数据应该是 websocket 消息格式,所以如果有不同的(也许更好?)解决方案,我也愿意课程。

谢谢!

编辑:添加了关于请求/连接的说明

4

1 回答 1

0

我不确定为什么US_REQUEST_DATA似乎没有保留您分配的内存块。

您可以试试persistence.c示例,看看它是否按预期工作?

除了 G-WAN 持久指针,您还可以使用 Linux 共享内存 API 等操作系统服务。

但是,一旦您复制并粘贴上面的示例,G-WAN API 应该可以正常工作。

其他值有不同的范围:

  • US_VHOST_DATA(范围:虚拟主机)
  • US_HANDLER_DATA(范围:监听器)
  • US_SERVER_DATA(范围:服务器)

使用下面每个 CONNECTION 唯一的会话 ID:

int session = (int)get_env(argv, SESSION_ID); 
于 2013-05-14T19:22:29.813 回答