Ejemplo n.º 1
0
int32_t interweb_ws_shake(kr_web_client *client) {

  int32_t pos;
  char *buffer;
  char acceptkey[64];

  pos = 0;
  buffer = (char *)client->out->buf;
  memset(acceptkey, 0, sizeof(acceptkey));

  interweb_ws_pack_gen_accept_resp (acceptkey, client->ws.key);

  pos += sprintf (buffer + pos, "HTTP/1.1 101 Switching Protocols\r\n");
  pos += sprintf (buffer + pos, "Upgrade: websocket\r\n");
  pos += sprintf (buffer + pos, "Connection: Upgrade\r\n");
  pos += sprintf (buffer + pos, "Sec-WebSocket-Protocol: krad-ws-api\r\n");
  pos += sprintf (buffer + pos, "Sec-WebSocket-Accept: %s\r\n", acceptkey);
  pos += sprintf (buffer + pos, "\r\n");

  kr_io2_advance (client->out, pos);
  client->ws.shaked = 1;
  set_socket_nodelay(client->sd);
  interweb_ws_json_hello(client);
  interweb_ws_kr_client_connect(client);

  //printk("interweb_ws_shake happens");

  return 0;
}
Ejemplo n.º 2
0
int make_socket
(
  os_socket * sock,
  unsigned short port,
  c_bool stream,
  c_bool reuse,
  const os_sockaddr_storage * mcip,
  const char * address
)
{
  int rc = -2;

  *sock = os_sockNew ((config.useIpv6 ? AF_INET6 : AF_INET), stream ? SOCK_STREAM : SOCK_DGRAM);

  if (! Q_VALID_SOCKET (*sock))
  {
    print_sockerror ("socket");
    return rc;
  }

  if (port && reuse && ((rc = set_reuse_options (*sock)) < 0))
  {
    goto fail;
  }

  if
  (
    (rc = set_rcvbuf (*sock) < 0) ||
    (rc = set_sndbuf (*sock) < 0) ||
    ((rc = maybe_set_dont_route (*sock)) < 0) ||
    ((rc = bind_socket (*sock, port, address)) < 0)
  )
  {
    goto fail;
  }

  if (! stream)
  {
    if ((rc = set_mc_options_transmit (*sock)) < 0)
    {
      goto fail;
    }
  }

  if (stream)
  {
#ifdef SO_NOSIGPIPE
    set_socket_nosigpipe (*sock);
#endif
#ifdef TCP_NODELAY
    if (config.tcp_nodelay)
    {
      set_socket_nodelay (*sock);
    }
#endif
  }

  if (mcip && ((rc = join_mcgroups (*sock, mcip)) < 0))
  {
    goto fail;
  }

  return 0;

fail:

  os_sockFree (*sock);
  *sock = Q_INVALID_SOCKET;
  return rc;
}