mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 01:24:18 +00:00
Update websockets implementation (fixes #1022)
seems to work with libwebsockets 2.4
This commit is contained in:
parent
ff872b39cd
commit
e9bc42a63c
|
@ -3,7 +3,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "engine/external/libwebsockets/libwebsockets.h"
|
#include <libwebsockets.h>
|
||||||
#include "base/system.h"
|
#include "base/system.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
|
@ -31,7 +31,7 @@ typedef struct
|
||||||
|
|
||||||
struct per_session_data
|
struct per_session_data
|
||||||
{
|
{
|
||||||
struct libwebsocket *wsi;
|
struct lws *wsi;
|
||||||
int port;
|
int port;
|
||||||
sockaddr_in addr;
|
sockaddr_in addr;
|
||||||
TSendBuffer send_buffer;
|
TSendBuffer send_buffer;
|
||||||
|
@ -39,7 +39,7 @@ struct per_session_data
|
||||||
|
|
||||||
struct context_data
|
struct context_data
|
||||||
{
|
{
|
||||||
libwebsocket_context *context;
|
lws_context *context;
|
||||||
per_session_data *port_map[WS_CLIENTS];
|
per_session_data *port_map[WS_CLIENTS];
|
||||||
TRecvBuffer recv_buffer;
|
TRecvBuffer recv_buffer;
|
||||||
int last_used_port;
|
int last_used_port;
|
||||||
|
@ -57,10 +57,11 @@ static int receive_chunk(context_data *ctx_data, struct per_session_data *pss, v
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int websocket_callback(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len)
|
static int websocket_callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
|
||||||
{
|
{
|
||||||
struct per_session_data *pss = (struct per_session_data *)user;
|
struct per_session_data *pss = (struct per_session_data *)user;
|
||||||
context_data *ctx_data = (context_data *)libwebsocket_context_user(context);
|
lws_context *context = lws_get_context(wsi);
|
||||||
|
context_data *ctx_data = (context_data *)lws_context_user(context);
|
||||||
|
|
||||||
switch(reason)
|
switch(reason)
|
||||||
{
|
{
|
||||||
|
@ -85,7 +86,7 @@ static int websocket_callback(struct libwebsocket_context *context, struct libwe
|
||||||
}
|
}
|
||||||
ctx_data->last_used_port = port;
|
ctx_data->last_used_port = port;
|
||||||
pss->wsi = wsi;
|
pss->wsi = wsi;
|
||||||
int fd = libwebsocket_get_socket_fd(wsi);
|
int fd = lws_get_socket_fd(wsi);
|
||||||
socklen_t addr_size = sizeof(pss->addr);
|
socklen_t addr_size = sizeof(pss->addr);
|
||||||
getpeername(fd, (struct sockaddr *)&pss->addr, &addr_size);
|
getpeername(fd, (struct sockaddr *)&pss->addr, &addr_size);
|
||||||
int orig_port = ntohs(pss->addr.sin_port);
|
int orig_port = ntohs(pss->addr.sin_port);
|
||||||
|
@ -117,17 +118,17 @@ static int websocket_callback(struct libwebsocket_context *context, struct libwe
|
||||||
if(chunk == NULL)
|
if(chunk == NULL)
|
||||||
break;
|
break;
|
||||||
int len = chunk->size - chunk->read;
|
int len = chunk->size - chunk->read;
|
||||||
int n = libwebsocket_write(wsi, &chunk->data[LWS_SEND_BUFFER_PRE_PADDING + chunk->read], chunk->size - chunk->read, LWS_WRITE_BINARY);
|
int n = lws_write(wsi, &chunk->data[LWS_SEND_BUFFER_PRE_PADDING + chunk->read], chunk->size - chunk->read, LWS_WRITE_BINARY);
|
||||||
if(n < 0)
|
if(n < 0)
|
||||||
return 1;
|
return 1;
|
||||||
if(n < len)
|
if(n < len)
|
||||||
{
|
{
|
||||||
chunk->read += n;
|
chunk->read += n;
|
||||||
libwebsocket_callback_on_writable(context, wsi);
|
lws_callback_on_writable(wsi);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pss->send_buffer.PopFirst();
|
pss->send_buffer.PopFirst();
|
||||||
libwebsocket_callback_on_writable(context, wsi);
|
lws_callback_on_writable(wsi);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -145,7 +146,7 @@ static int websocket_callback(struct libwebsocket_context *context, struct libwe
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct libwebsocket_protocols protocols[] = { {
|
static struct lws_protocols protocols[] = { {
|
||||||
"binary", /* name */
|
"binary", /* name */
|
||||||
websocket_callback, /* callback */
|
websocket_callback, /* callback */
|
||||||
sizeof(struct per_session_data) /* per_session_data_size */
|
sizeof(struct per_session_data) /* per_session_data_size */
|
||||||
|
@ -182,7 +183,7 @@ int websocket_create(const char *addr, int port)
|
||||||
context_data *ctx_data = &contexts[first_free];
|
context_data *ctx_data = &contexts[first_free];
|
||||||
info.user = (void *)ctx_data;
|
info.user = (void *)ctx_data;
|
||||||
|
|
||||||
ctx_data->context = libwebsocket_create_context(&info);
|
ctx_data->context = lws_create_context(&info);
|
||||||
if(ctx_data->context == NULL)
|
if(ctx_data->context == NULL)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -195,23 +196,23 @@ int websocket_create(const char *addr, int port)
|
||||||
|
|
||||||
int websocket_destroy(int socket)
|
int websocket_destroy(int socket)
|
||||||
{
|
{
|
||||||
libwebsocket_context *context = contexts[socket].context;
|
lws_context *context = contexts[socket].context;
|
||||||
if(context == NULL)
|
if(context == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
libwebsocket_context_destroy(context);
|
lws_context_destroy(context);
|
||||||
contexts[socket].context = NULL;
|
contexts[socket].context = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int websocket_recv(int socket, unsigned char *data, size_t maxsize, struct sockaddr_in *sockaddrbuf, size_t fromLen)
|
int websocket_recv(int socket, unsigned char *data, size_t maxsize, struct sockaddr_in *sockaddrbuf, size_t fromLen)
|
||||||
{
|
{
|
||||||
libwebsocket_context *context = contexts[socket].context;
|
lws_context *context = contexts[socket].context;
|
||||||
if(context == NULL)
|
if(context == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
int n = libwebsocket_service(context, 0);
|
int n = lws_service(context, 0);
|
||||||
if(n < 0)
|
if(n < 0)
|
||||||
return n;
|
return n;
|
||||||
context_data *ctx_data = (context_data *)libwebsocket_context_user(context);
|
context_data *ctx_data = (context_data *)lws_context_user(context);
|
||||||
websocket_chunk *chunk = (websocket_chunk *)ctx_data->recv_buffer.First();
|
websocket_chunk *chunk = (websocket_chunk *)ctx_data->recv_buffer.First();
|
||||||
if(chunk == 0)
|
if(chunk == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -234,10 +235,10 @@ int websocket_recv(int socket, unsigned char *data, size_t maxsize, struct socka
|
||||||
|
|
||||||
int websocket_send(int socket, const unsigned char *data, size_t size, int port)
|
int websocket_send(int socket, const unsigned char *data, size_t size, int port)
|
||||||
{
|
{
|
||||||
libwebsocket_context *context = contexts[socket].context;
|
lws_context *context = contexts[socket].context;
|
||||||
if(context == NULL)
|
if(context == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
context_data *ctx_data = (context_data *)libwebsocket_context_user(context);
|
context_data *ctx_data = (context_data *)lws_context_user(context);
|
||||||
struct per_session_data *pss = ctx_data->port_map[port];
|
struct per_session_data *pss = ctx_data->port_map[port];
|
||||||
if(pss == NULL)
|
if(pss == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -248,23 +249,23 @@ int websocket_send(int socket, const unsigned char *data, size_t size, int port)
|
||||||
chunk->read = 0;
|
chunk->read = 0;
|
||||||
memcpy(&chunk->addr, &pss->addr, sizeof(sockaddr_in));
|
memcpy(&chunk->addr, &pss->addr, sizeof(sockaddr_in));
|
||||||
memcpy(&chunk->data[LWS_SEND_BUFFER_PRE_PADDING], data, size);
|
memcpy(&chunk->data[LWS_SEND_BUFFER_PRE_PADDING], data, size);
|
||||||
libwebsocket_callback_on_writable(context, pss->wsi);
|
lws_callback_on_writable(pss->wsi);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int websocket_fd_set(int socket, fd_set *set)
|
int websocket_fd_set(int socket, fd_set *set)
|
||||||
{
|
{
|
||||||
libwebsocket_context *context = contexts[socket].context;
|
lws_context *context = contexts[socket].context;
|
||||||
if(context == NULL)
|
if(context == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
context_data *ctx_data = (context_data *)libwebsocket_context_user(context);
|
context_data *ctx_data = (context_data *)lws_context_user(context);
|
||||||
int max = 0;
|
int max = 0;
|
||||||
for(int i = 0; i < WS_CLIENTS; i++)
|
for(int i = 0; i < WS_CLIENTS; i++)
|
||||||
{
|
{
|
||||||
per_session_data *pss = ctx_data->port_map[i];
|
per_session_data *pss = ctx_data->port_map[i];
|
||||||
if(pss == NULL)
|
if(pss == NULL)
|
||||||
continue;
|
continue;
|
||||||
int fd = libwebsocket_get_socket_fd(pss->wsi);
|
int fd = lws_get_socket_fd(pss->wsi);
|
||||||
if(fd > max)
|
if(fd > max)
|
||||||
max = fd;
|
max = fd;
|
||||||
FD_SET(fd, set);
|
FD_SET(fd, set);
|
||||||
|
|
Loading…
Reference in a new issue