libwebsockets 编译

6-08 2,474 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;
}

COM in plain C

https://www.codeproject.com/Articles/13601/COM-in-plain-C

阅读全文

A Brief Intro to Input Method Framework, Linux IME, and XIM

https://tedyin.com/posts/a-brief-intro-to-linux-input-method-framework/ There are chances one need an input method editor (IME). For CJK users, su...

阅读全文

使用Visual studio查看exe或DLL文件的依赖项

事先准备:只要 Visual Studio 任何版本即可。 点击开始 -> 程序 -> Visual Studio对应的版本,打开Visual Studio Tools -> 选择 命令提示 进入命...

阅读全文

欢迎留言