libwebsockets libwebsockets-webserver.c hacking

/**********************************************************************************
 *                libwebsockets libwebsockets-webserver.c hacking
 * 说明:
 *     找点libwesockets的资料看看,主要是为后续使用做准备。
 *
 *                                           2017-6-9 深圳 龙华樟坑村 曾剑锋
 *********************************************************************************/

一、参考文档:
    1. libwebsockets如何使用?
        https://www.zhihu.com/question/57474416
    2. libwebsockets: Simple HTTP server
        https://medium.com/@martin.sikora/libwebsockets-simple-http-server-2b34c13ab540
    3. martinsik/libwebsockets-webserver.c
        https://gist.github.com/martinsik/3216369
    4. martinsik/index.html
        https://gist.github.com/martinsik/3654228

二、代码解读:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <libwebsockets.h>

    // 浏览器websocket访问的回调函数
    static int callback_http(struct libwebsocket_context *context,
                             struct libwebsocket *wsi,
                             enum libwebsocket_callback_reasons reason, void *user,
                             void *in, size_t len)
    {

        switch (reason) {
            // 头文件链接描述,出了作为Server会喷出一行连接建立以外,这里不进行任何处理
            // http://git.warmcat.com/cgi-bin/cgit/libwebsockets/tree/lib/libwebsockets.h#n260
            case LWS_CALLBACK_CLIENT_WRITEABLE:
                printf("connection established\n");

            // 头文件链接描述
            // http://git.warmcat.com/cgi-bin/cgit/libwebsockets/tree/lib/libwebsockets.h#n281
            case LWS_CALLBACK_HTTP: {
                char *requested_uri = (char *) in;
                printf("requested URI: %s\n", requested_uri);       // 喷出访问的URL

                // uri为"/"访问,直接给出hello world
                if (strcmp(requested_uri, "/") == 0) {
                    void *universal_response = "Hello, World!";
                    // http://git.warmcat.com/cgi-bin/cgit/libwebsockets/tree/lib/libwebsockets.h#n597
                    libwebsocket_write(wsi, universal_response,
                                       strlen(universal_response), LWS_WRITE_HTTP);
                    break;

                } else {
                    // try to get current working directory
                    char cwd[1024];
                    char *resource_path;

                    if (getcwd(cwd, sizeof(cwd)) != NULL) {
                        // allocate enough memory for the resource path
                        // 动态分配路径存储空间
                        resource_path = malloc(strlen(cwd) + strlen(requested_uri));

                        // join current working direcotry to the resource path
                        // 合成资源路径
                        sprintf(resource_path, "%s%s", cwd, requested_uri);
                        printf("resource path: %s\n", resource_path);

                        // 获取文件扩展名
                        char *extension = strrchr(resource_path, ‘.‘);
                        char *mime;

                        // choose mime type based on the file extension
                        // 设置扩展类型
                        if (extension == NULL) {
                            mime = "text/plain";
                        } else if (strcmp(extension, ".png") == 0) {
                            mime = "image/png";
                        } else if (strcmp(extension, ".jpg") == 0) {
                            mime = "image/jpg";
                        } else if (strcmp(extension, ".gif") == 0) {
                            mime = "image/gif";
                        } else if (strcmp(extension, ".html") == 0) {
                            mime = "text/html";
                        } else if (strcmp(extension, ".css") == 0) {
                            mime = "text/css";
                        } else {
                            mime = "text/plain";
                        }

                        // by default non existing resources return code 400
                        // for more information how this function handles headers
                        // see it‘s source code
                        // http://git.warmcat.com/cgi-bin/cgit/libwebsockets/tree/lib/parsers.c#n1896
                        libwebsockets_serve_http_file(wsi, resource_path, mime);

                    }
                }

                // close connection
                // 关闭连接
                libwebsocket_close_and_free_session(context, wsi,
                                                    LWS_CLOSE_STATUS_NORMAL);
                break;
            }
            default:
                printf("unhandled callback\n");
                break;
        }

        return 0;
    }

    /* list of supported protocols and callbacks */
    // 配置协议以及其回调函数
    static struct libwebsocket_protocols protocols[] = {
        /* first protocol must always be HTTP handler */

        {
            "http-only",    /* name */
            callback_http,  /* callback */
            0               /* per_session_data_size */
        },
        {
            NULL, NULL, 0   /* End of list */
        }

    };

    int main(void) {
        // server url will be http://localhost:7681
        int port = 8080;
        const char *interface = NULL;
        struct libwebsocket_context *context;
         // we‘re not using ssl
        const char *cert_path = NULL;
        const char *key_path = NULL;
        // no special options
        int opts = 0;

        // create libwebsocket context representing this server
        // 创建上下文
        context = libwebsocket_create_context(port, interface, protocols,
                                              libwebsocket_internal_extensions,
                                              cert_path, key_path, -1, -1, opts);

        if (context == NULL) {
            fprintf(stderr, "libwebsocket init failed\n");
            return -1;
        }

        printf("starting server...\n");

        // infinite loop, the only option to end this serer is
        // by sending SIGTERM. (CTRL+C)
        while (1) {
            libwebsocket_service(context, 50);
            // libwebsocket_service will process all waiting events with their
            // callback functions and then wait 50 ms.
            // (this is single threaded webserver and this will keep
            // our server from generating load while there are not
            // requests to process)
        }

        libwebsocket_context_destroy(context);

        return 0;
    }
时间: 2024-10-05 07:15:16

libwebsockets libwebsockets-webserver.c hacking的相关文章

libwebsockets 运行问题

/****************************************************************************** * libwebsockets 运行问题 * 说明: * 编译发现libwebsockets运行出问题,解决一下. * * 2017-6-28 深圳 龙华樟坑村 曾剑锋 *****************************************************************************/ 一.错误现象

WebSocket协议

websocket 简介 (2013-04-09 15:39:28) 转载▼   分类: websocket 一 WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个浏览器对协议的实现也在不停的更新.该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在

Websocket简介

WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个浏览器对协议的实现也在不停的更新.该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在已经有十几个版本了,目前最新的是版本17,所对应的协议版本号为13,目前对该协议支持最完善的浏览器应该是chrom

websocket 与Socket.IO介绍

一  websocket WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safrie,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协 议草案的不断变化,各个浏览器对协议的实现也在不停的更新.该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了. 1. WebSocket API 首先看一段简单的javascript代码,该代码调用了WebSockets的API.

关于Socket.IO的知识点记录

最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在express框架路由.模板渲染那里看到了Yii2的影子,所以便更加的亲切了.再接着便接触到了websocket,而今天谈论的socket.io 便是websocket的一个类库,说道这里了,我们先去了解下websocket和socket.io: 一  websocket WebSocket是html5新增加的

基于构建实时WEb应用的HTML5 WebSocket协议&lt;二&gt;

前面说了那么多的理论,我们来看下代码学习. WebSocketAPI简介 首先看一段简单的javascript代码,该代码调用了WebSockets的API. var ws = new WebSocket("ws://echo.websocket.org"); ws.onopen = function(){ws.send("Test!"); }; ws.onmessage = function(evt){console.log(evt.data);ws.close(

MinGW 编译libwebsockets

libwebsockets是一个轻量的纯C库,在这里尝试使用MinGW进行构建. 官网地址:http://libwebsockets.org/trac/libwebsockets下载地址:http://git.warmcat.com/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.22-chrome26-firefox18.tar.gz 首先,搭建MSYS2环境,参见文章<MSYS2 环境搭建>,编译之前得有autoconf.automa

什么是WEBserver? 经常使用的WEBserver有哪些?

一.什么是WEBserver Webserver能够解析HTTP协议.当Webserver接收到一个HTTP请求,会返回一个HTTP响应,比如送回一个HTML页面.为了处理一个请求Webserver能够响应一个静态页面或图片,进行页面跳转或者把动态响应的产生托付给一些其他的程序比如CGI脚本,JSP脚本,servlets,ASP脚本,server端JavaScript,或者一些其他的server端技术.不管它们(译者注:脚本)的目的怎样,这些server端的程序通常产生一个HTML的响应来让浏览

移动安全初探:窃取微信聊天记录、Hacking Android with Metasploit

在这篇文章中我们将讨论如何获取安卓.苹果设备中的微信聊天记录,并演示如何利用后门通过Metasploit对安卓设备进行控制.文章比较基础.可动手性强,有设备的童鞋不妨边阅读文章边操作,希望能激发大家对移动终端的安全兴趣. (文章内容存在一定攻击性,目的在于普及终端安全知识.提高安全意识,如有非法使用,后果自负) “如何获取Android.iPhone手机上的微信聊天记录? ” 0×00 条件: 安卓设备已获取root权限,安装SSHDroid(通过ssh.ftp连接手机) Apple设备越狱,安