使用websockets的GWAN双向通信

时间:2013-05-12 15:51:28

标签: c websocket g-wan

解决

我的读取问题的解决方案是将代码移动到处理程序,并使用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的file_fd上使用WK_FD唤醒唤醒(argv,HTTP_HEADERS);无论我做什么,wake_up似乎都不起作用(尝试使用值为1000到100000的WK_MS没有区别 - 返回RC_NOHEADERS + RC_STREAMING后立即再次调用servlet) - recv on get_env(argv,CLIENT_SOCKET);这里recv告诉我,无论我操作什么(int值为0)都不是套接字(过去从来没有让CLIENT_SOCKET工作,我一定做错了吗?) - 简单睡眠(1)(最多20个)调用 - READ_XBUF之后没有新数据,即使客户端上的wireshark +服务器上的tcpdump告诉我有数据从客户端传送到服务器

我也曾尝试使用不同的处理程序状态返回1以“过去从客户端读取更多数据”(某些版本以前,所以可能已经修复了 - 但正如所说,我更喜欢使用servlet的解决方案) 。这甚至不适用于简单的ajax post请求(大多数浏览器在使用post时在第二个tcp数据包中发送post数据,因此你最初不会使用gwan获取有效负载),所以也没有运气。

PS:在旁注上(据我所知,吉尔在这里回答了大部分与gwan相关的问题),我已经想在GWAN网站上签了几次业余爱好者支持合同,但我还没有了解如何超越初始价格表(截至编写本报告时尚未提供欧元)。

我很乐意提供任何有助于解决此问题的代码,

非常感谢你的时间。

编辑:主要功能代码(我知道终止代码是错误的,所以请暂时忽略它,因为这也不是我在这里提问的原因)

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;

3 个答案:

答案 0 :(得分:0)

没有任何代码你正在使用它几乎不可能调试你可能出错的地方。

此外,我也想知道付款方式,我相信他会使用PayPal或其他支付网关,付款将自动从您自己的货币转换为CHF。如果是直接信用卡商家授权,可能会从您的信用卡公司收取交换费,通常为3%。

答案 1 :(得分:0)

使用这个库怎么样? https://github.com/payden/libwebsock而不是试图重写完整的websocket实现?

答案 2 :(得分:0)

G-WAN Servlets显然不是实施网络协议的最有效方式。

由于websockets违反了HTTP协议,您应该使用G-WAN Handler

G-WAN Protocol Handlers致力于此任务。该领域缺乏文档和示例,因为我们最近不得不关注基于G-WAN的应用程序。