6 #define WEBSOCKET_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 7 #define B64BUFFLEN 1024 11 #include <arpa/inet.h> 13 #include <sys/socket.h> 16 #pragma warning(disable:4996) 26 #include <openssl/ssl.h> 28 #if defined(_MSC_VER) || defined(__APPLE__) || defined(__FreeBSD__) || (defined(__SVR4) && defined(__sun)) 29 #define __bswap_64(x) \ 31 ((x<<40) & 0x00FF000000000000) | \ 32 ((x<<24) & 0x0000FF0000000000) | \ 33 ((x<<8) & 0x000000FF00000000) | \ 34 ((x>>8) & 0x00000000FF000000) | \ 35 ((x>>24) & 0x0000000000FF0000) | \ 36 ((x>>40) & 0x000000000000FF00) | \ 41 #define strncasecmp _strnicmp 44 #define snprintf _snprintf 47 #define WS_SSIZE_T __int64 48 #elif _MSC_VER >= 1400 49 #define WS_SSIZE_T __int32 __w64 51 #define WS_SSIZE_T __int32 53 typedef WS_SSIZE_T ssize_t;
58 const SSL_METHOD *ssl_method;
67 typedef int ws_socket_t;
69 typedef SOCKET ws_socket_t;
71 #define ws_sock_invalid (ws_socket_t)-1 78 WS_DATA_TOO_BIG = 1009
82 WSOC_CONTINUATION = 0x0,
90 typedef struct wsh_s {
111 int secure_established;
112 int logical_established;
116 size_t write_buffer_len;
119 ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
120 ssize_t ws_feed_buf(wsh_t *wsh,
void *data,
size_t bytes);
122 int establish_logical_layer(wsh_t *wsh);
123 ssize_t ws_raw_read(wsh_t *wsh,
void *data,
size_t bytes,
int block);
124 ssize_t ws_raw_write(wsh_t *wsh,
void *data,
size_t bytes);
125 ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc,
uint8_t **data);
126 ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc,
void *data,
size_t bytes);
127 int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx,
int close_sock,
int block,
int stay_open);
128 ssize_t ws_close(wsh_t *wsh,
int16_t reason);
129 void ws_destroy(wsh_t *wsh);
131 void deinit_ssl(
void);
133 int xp_is_blocking(
int errcode);
138 static inline uint64_t get_unaligned_uint64(
const void *p)
140 const struct {
uint64_t d; } __attribute__((packed)) *pp = p;