G-WAN在处理程序中保留请求数据

时间:2013-05-14 18:41:38

标签: c websocket 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 handshake
  • 处理程序启动,进入:
    • 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消息格式,所以如果有一个不同的(可能更好的?)解决方案,我对此持开放态度当然也是。

谢谢!

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

1 个答案:

答案 0 :(得分:0)

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

您可以尝试使用persistence.c示例来查看它是否按预期工作吗?

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

但是一旦你复制和放弃G-WAN API应该可以正常工作。粘贴上面的例子。

其他值具有不同的范围:

  • US_VHOST_DATA(范围:vhost)
  • US_HANDLER_DATA(范围:听众)
  • US_SERVER_DATA(范围:服务器)

使用下面的会话ID,该ID对每个CONNECTION都是唯一的:

int session = (int)get_env(argv, SESSION_ID);