6-08 2,475 views
libwebsockets.h 4340
将 ssize_t 改为 ssize_t_longptr
#if defined(WIN32) || defined(_WIN32)
/* ... */
#if !defined(ssize_t_longptr)
typedef SSIZE_T ssize_t_longptr;
#endif
#endif
windows
without ssl
cmake -DLWS_WITH_SSL=0 -G "Visual Studio 14" ..
build for static server only
cmake -DLWS_WITH_STATIC=1 -DLWS_WITH_SHARED=0 -DLWS_WITH_SSL=0 -DLWS_WITHOUT_CLIENT=1 -G "Visual Studio 14" ..
mingw
libwebsockets
默认的cmake版本为 3.6.2,需要先更新cmake的版本
pacman -S mingw-w64-i686-cmake
pacman -S mingw-w64-x86_64-cmake
使用cmake生成makefile
cmake -DCMAKE_C_COMPILER="i686-w64-mingw32-gcc" -DCMAKE_CXX_COMPILER="i686-w64-mingw32-g++" -DLWS_WITH_STATIC=1 -DLWS_WITH_SHARED=0 -DLWS_WITH_SSL=0 -DLWS_WITHOUT_CLIENT=1 -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=$HOME/prefix ..
不编译TEST应用
cmake -DCMAKE_C_COMPILER="i686-w64-mingw32-gcc" -DCMAKE_CXX_COMPILER="i686-w64-mingw32-g++" -DLWS_WITH_STATIC=ON -DLWS_WITH_SHARED=OFF -DLWS_WITH_SSL=ON -DLWS_WITHOUT_CLIENT=ON -DLWS_USE_LIBEV=OFF -DLWS_USE_LIBUV=OFF -DLWS_WITHOUT_TESTAPPS=ON -DLWS_WITHOUT_TEST_SERVER=ON -DLWS_WITHOUT_TEST_SERVER_EXTPOLL=ON -DLWS_WITHOUT_TEST_PING=ON -DLWS_WITHOUT_TEST_ECHO=ON -DLWS_WITHOUT_TEST_CLIENT=ON -DLWS_WITHOUT_TEST_FRAGGLE=ON -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=$HOME/prefix ..
编译出错

将
_lws_plat_file_open(struct lws_plat_file_ops *fops, const char *filename,
const char *vpath, lws_fop_flags_t *flags)
改为
_lws_plat_file_open(const struct lws_plat_file_ops *fops, const char *filename,
const char *vpath, lws_fop_flags_t *flags)
只编译libwebsockets库
make websockets
没有pkg-config,导致库连接不上
创建文件 websockets_static.pc,拷贝到prefix\lib\pkgconfig文件夹下
# Package Information for pkg-config
prefix=/home/Neo/prefix
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: websockets_static
Description: libwebsockets
Version: 2.2.1
Libs: -L${libdir} -lwebsockets_static
Libs.private:
Cflags: -I${includedir}
demo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "websockserver.h"
static int destroy_flag = 0;
static void INT_HANDLER(int signo) {
destroy_flag = 1;
}
/**
* websocket_write_back: write the string data to the destination wsi.
*/
int websocket_write_back(struct lws *wsi_in, char *str, int str_size_in)
{
if (str == NULL || wsi_in == NULL)
return -1;
int n;
int len;
unsigned char *out = NULL;
if (str_size_in < 1)
len = strlen(str);
else
len = str_size_in;
out = (unsigned char *)malloc(sizeof(char)*(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING));
//* setup the buffer*/
memcpy(out + LWS_SEND_BUFFER_PRE_PADDING, str, len);
//* write out*/
n = lws_write(wsi_in, out + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
//printf("[websocket_write_back] %s\n", str);
//* free the buffer*/
free(out);
return n;
}
static int ws_service_callback(
struct lws *wsi,
enum lws_callback_reasons reason, void *user,
void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
printf("[Main Service] Connection established\n");
break;
//* If receive a data from client*/
case LWS_CALLBACK_RECEIVE:
printf("[Main Service] Server recvived:%s\n", (char *)in);
//* echo back to client*/
websocket_write_back(wsi, (char *)in, -1);
break;
case LWS_CALLBACK_CLOSED:
printf("[Main Service] Client close.\n");
break;
case LWS_CALLBACK_RECEIVE_PONG:
printf("LWS_CALLBACK_RECEIVE_PONG:%s\n", (char *)in);
break;
/**< servers receive PONG packets with this callback reason */
case LWS_CALLBACK_CLIENT_RECEIVE:
printf("LWS_CALLBACK_CLIENT_RECEIVE:%s\n", (char *)in);
break;
/**< data has appeared from the server for the client connection, it
* can be found at *in and is len bytes long */
case LWS_CALLBACK_CLIENT_RECEIVE_PONG:
printf("LWS_CALLBACK_CLIENT_RECEIVE_PONG:%s\n", (char *)in);
break;
default:
break;
}
return 0;
}
struct per_session_data {
int fd;
};
int main(void) {
lws_set_log_level(8, lwsl_emit_syslog);
// server url will usd port 5000
int port = 1234;
const char *interface = NULL;
struct lws_context_creation_info info;
struct lws_context *context;
// Not using ssl
const char *cert_path = NULL;
const char *key_path = NULL;
// no special options
int opts = 0;
//* setup websocket protocol */
struct lws_protocols protocols[] = {
/* first protocol must always be HTTP handler */
{
"my-echo-protocol", /* name */
ws_service_callback, /* callback */
sizeof(struct per_session_data), /* per_session_data_size */
4096*100, /* max frame size / rx buffer */
},
{ NULL, NULL, 0, 0 } /* terminator */
};
//* setup websocket context info*/
memset(&info, 0, sizeof info);
info.port = port;
info.iface = NULL;
info.protocols = protocols;
info.extensions = NULL; // lws_get_internal_extensions();
info.ssl_cert_filepath = NULL;
info.ssl_private_key_filepath = NULL;
info.gid = -1;
info.uid = -1;
info.options = NULL; // options»¹Óкܶà¿ÉÓõIJÎÊý
//* create libwebsocket context. */
context = lws_create_context(&info);
if (context == NULL) {
printf("[Main] Websocket context create error.\n");
return -1;
}
printf("[Main] Websocket context create success.\n");
//* websocket service */
while (!destroy_flag) {
lws_service(context, 100);
}
lws_context_destroy(context);
return 0;
}