解决方案:
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消息格式,所以如果有不同的(也许更好的?(解决方案,我当然也对此持开放态度。
谢谢!
编辑:添加了关于请求/连接的说明
我不知道为什么US_REQUEST_DATA
似乎没有保留您分配的内存块。
你能试试persistence.c的例子看看它是否如你所期望的那样工作吗?
除了G-WAN持久指针之外,您还可以使用Linux共享内存API等操作系统服务
但是,一旦你复制了G-WAN API应该工作良好;粘贴上面的示例。
其他值具有不同的范围:
- US_VHOST_DATA(作用域:VHOST(
- US_HANDLER_DATA(作用域:侦听器(
- US_SERVER_DATA(作用域:服务器(
使用下面的会话ID,该ID对每个连接都是唯一的:
int session = (int)get_env(argv, SESSION_ID);