diff --git a/libwebsockets.c b/libwebsockets.c index 5b2628da..fc67be75 100644 --- a/libwebsockets.c +++ b/libwebsockets.c @@ -128,7 +128,10 @@ const struct lws_tokens lws_tokens[WSI_TOKEN_COUNT] = { }; -int libwebsocket_create_server(int port, int (*callback)(struct libwebsocket *, enum libwebsocket_callback_reasons, void *, size_t)) +int libwebsocket_create_server(int port, + int (*callback)(struct libwebsocket *, + enum libwebsocket_callback_reasons, void *, size_t), + int protocol) { int n; int sockfd, newsockfd; @@ -149,8 +152,18 @@ int libwebsocket_create_server(int port, int (*callback)(struct libwebsocket *, } wsi->callback = callback; -// wsi->ietf_spec_revision = 0; - wsi->ietf_spec_revision = 76; + switch (protocol) { + case 0: + case 2: + case 76: + fprintf(stderr, "Using protocol v%d\n", protocol); + wsi->ietf_spec_revision = protocol; + break; + default: + fprintf(stderr, "protocol %d not supported (try 0 2 or 76)\n", + protocol); + return -1; + } /* sit there listening for connects, accept and spawn session servers */ @@ -165,7 +178,8 @@ int libwebsocket_create_server(int port, int (*callback)(struct libwebsocket *, serv_addr.sin_port = htons(port); n = bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if (n < 0) { - fprintf(stderr, "ERROR on binding %d %d\n", n, errno); + fprintf(stderr, "ERROR on binding to port %d (%d %d)\n", port, n, + errno); return -1; } @@ -182,7 +196,8 @@ int libwebsocket_create_server(int port, int (*callback)(struct libwebsocket *, if (n) return 0; - + fprintf(stderr, "Listening on port %d\n", port); + listen(sockfd, 5); while (1) { @@ -539,15 +554,14 @@ int libwebsocket_read(struct libwebsocket *wsi, unsigned char * buf, size_t len) p += wsi->utf8_token[WSI_TOKEN_HOST].token_len; strcpy(p, wsi->utf8_token[WSI_TOKEN_GET_URI].token); p += wsi->utf8_token[WSI_TOKEN_GET_URI].token_len; - strcpy(p, "\x0d\x0aSec-WebSocket-Protocol: "); - p += strlen("\x0d\x0aSec-WebSocket-Protocol: "); + if (wsi->utf8_token[WSI_TOKEN_PROTOCOL].token) { + strcpy(p, "\x0d\x0aSec-WebSocket-Protocol: "); + p += strlen("\x0d\x0aSec-WebSocket-Protocol: "); strcpy(p, wsi->utf8_token[WSI_TOKEN_PROTOCOL].token); p += wsi->utf8_token[WSI_TOKEN_PROTOCOL].token_len; - } else { - strcpy(p, "none"); - p += strlen("none"); } + strcpy(p, "\x0d\x0a\x0d\x0a"); p += strlen("\x0d\x0a\x0d\x0a"); @@ -734,6 +748,11 @@ int libwebsocket_write(struct libwebsocket * wsi, unsigned char *buf, } break; } + + for (n = 0; n < (len + pre + post); n++) + fprintf(stderr, "%02X ", buf[n - pre]); + + fprintf(stderr, "\n"); n = write(wsi->sock, buf - pre, len + pre + post); if (n < 0) { diff --git a/libwebsockets.h b/libwebsockets.h index b23f588f..0264957b 100644 --- a/libwebsockets.h +++ b/libwebsockets.h @@ -10,7 +10,8 @@ struct libwebsocket; extern int libwebsocket_create_server(int port, int (*callback)(struct libwebsocket *, - enum libwebsocket_callback_reasons, void *, size_t)); + enum libwebsocket_callback_reasons, void *, size_t), + int protocol); /* * IMPORTANT NOTICE! diff --git a/test-server.c b/test-server.c index 4f13664e..1717c4de 100644 --- a/test-server.c +++ b/test-server.c @@ -1,10 +1,19 @@ #include #include #include +#include #include "libwebsockets.h" -#define PORT 7681 +/* + * libwebsocket Example server Copyright 2010 Andy Green + * + * Shows how to use libwebsocket + */ + + +static int port = 7681; +static int ws_protocol = 76; static int websocket_callback(struct libwebsocket * wsi, enum libwebsocket_callback_reasons reason, void *in, size_t len) @@ -12,10 +21,12 @@ static int websocket_callback(struct libwebsocket * wsi, int n; char buf[LWS_SEND_BUFFER_PRE_PADDING + 256 + LWS_SEND_BUFFER_POST_PADDING]; static int bump; + static int slow; switch (reason) { case LWS_CALLBACK_ESTABLISHED: fprintf(stderr, "Websocket connection established\n"); + slow = 500; break; case LWS_CALLBACK_CLOSED: @@ -23,8 +34,13 @@ static int websocket_callback(struct libwebsocket * wsi, break; case LWS_CALLBACK_SEND: - sleep(1); - n = sprintf(&buf[LWS_SEND_BUFFER_PRE_PADDING], "%d\n", bump++); + slow--; + if (slow) { + usleep(10000); + break; + } + slow = 100; + n = sprintf(&buf[LWS_SEND_BUFFER_PRE_PADDING], "%d", bump++); n = libwebsocket_write(wsi, (unsigned char *)&buf[LWS_SEND_BUFFER_PRE_PADDING], n, 0); if (n < 0) { fprintf(stderr, "ERROR writing to socket"); @@ -39,16 +55,42 @@ static int websocket_callback(struct libwebsocket * wsi, return 0; } +static struct option options[] = { + { "help", no_argument, NULL, 'h' }, + { "port", required_argument, NULL, 'p' }, + { "protocol", required_argument, NULL, 'r' }, + { NULL, 0, 0, 0 } +}; -int main(int argv, char **argc) +int main(int argc, char **argv) { - if (libwebsocket_create_server(PORT, websocket_callback) < 0) { + int n = 0; + + fprintf(stderr, "libwebsockets test server\nCopyright 2010 Andy Green licensed under GPL2\n"); + + while (n >= 0) { + n = getopt_long(argc, argv, "hp:r:", options, NULL); + if (n < 0) + continue; + switch (n) { + case 'p': + port = atoi(optarg); + break; + case 'r': + ws_protocol = atoi(optarg); + break; + case 'h': + fprintf(stderr, "Usage: test-server [--port=

] [--protocol=]\n"); + exit(1); + } + + } + + if (libwebsocket_create_server(port, websocket_callback, ws_protocol) < 0) { fprintf(stderr, "libwebsocket init failed\n"); return -1; } - - fprintf(stderr, "Listening on port %d\n", PORT); - + while (1) sleep(1);