c-G-WAN在处理程序中持久化请求数据



解决方案:

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

最新更新