websocket服务器

绑定client端的ip和port,监听client的消息,如果对方发送一个json格式的字符串,就给对方回复一个json格式的"type-join"的字符串,实现交互

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <libwebsockets.h>
#include <json-c/json.h>

#define MAX_JSON_SIZE 1024

static struct lws *client_conn = NULL;

static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason,
                       void *user, void *in, size_t len)
{
    switch (reason) {
        case LWS_CALLBACK_CLIENT_ESTABLISHED:
            printf("WebSocket Client Connection established\n");
            client_conn = wsi;
            break;

        case LWS_CALLBACK_CLIENT_RECEIVE:
            printf("Received data from server: %s\n", (char *) in);
            // Parse JSON
            struct json_object *jobj, *jtype;
            jobj = json_tokener_parse(in);
            if (jobj == NULL) {
                printf("Error parsing JSON data\n");
                break;
            }
            // Get type field
            if (!json_object_object_get_ex(jobj, "type", &jtype)) {
                printf("JSON object does not contain type field\n");
                json_object_put(jobj);
                break;
            }
            const char *type = json_object_get_string(jtype);
            printf("Received JSON with type %s\n", type);
            // Check if type is join
            if (strcmp(type, "join") == 0) {
                // Send response JSON with type join
                char *response = "{\"type\": \"join\"}";
                lws_write(client_conn, (unsigned char *) response, strlen(response), LWS_WRITE_TEXT);
            }
            json_object_put(jobj);
            break;

        case LWS_CALLBACK_CLIENT_WRITEABLE:
            break;

        case LWS_CALLBACK_CLOSED:
            printf("WebSocket Connection Closed\n");
            lws_context_destroy(wsi->context);
            break;

        default:
            break;
    }

    return 0;
}

int main(int argc, char **argv)
{
    WSADATA wsa_data;
    int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    if (result != 0) {
        printf("WSAStartup failed with error: %d\n", result);
        return -1;
    }

    const char *server_address = "192.168.1.100";
    const int server_port = 8080;

    // Initiate libwebsockets
    struct lws_context_creation_info info;
    memset(&info, 0, sizeof(info));
    info.port = CONTEXT_PORT_NO_LISTEN;
    info.protocols = (struct lws_protocols[]) {
        { "ws", callback_ws, 0 },
        { NULL, NULL, 0 }
    };

    struct lws_context *context = lws_create_context(&info);
    if (context == NULL) {
        printf("Error creating websocket context\n");
        return -1;
    }

    // Connect to server
    struct lws_client_connect_info connect_info;
    memset(&connect_info, 0, sizeof(connect_info));
    connect_info.context = context;
    connect_info.address = server_address;
    connect_info.port = server_port;
    connect_info.path = "/";
    connect_info.host = connect_info.address;
    connect_info.ietf_version_or_minus_one = -1;
    connect_info.ssl_connection = 0;
    connect_info.client_exts = NULL;
    connect_info.method = "GET";

    struct lws *conn = lws_client_connect_via_info(&connect_info);
    if (conn == NULL) {
        printf("Error connecting to server\n");
        return -1;
    }

    // Wait for connection to be established
    while (client_conn == NULL) {
        lws_service(context, 0);
    }

    printf("Connected to server\n");

    // Wait for data to be received
    while (true) {
        lws_service(context, 0);
    }

    lws_context_destroy(context);

    return 0;
}
相关推荐
running thunderbolt30 分钟前
项目---网络通信组件JsonRpc
linux·服务器·c语言·开发语言·网络·c++·性能优化
影子240140 分钟前
Windows Server2016 服务器安装JDK,一直卡在“应用程序正在为首次使用作准备,请稍候” ,导致jdk安装失败解决方案
运维·服务器·windows·jdk
_OP_CHEN1 小时前
Linux 系统编程:(一)从历史演进到 XShell 远程登录实操
linux·运维·服务器·centos·unix·xshell
为java加瓦2 小时前
Rust 的类型自动解引用:隐藏在人体工学设计中的魔法
java·服务器·rust
未来之窗软件服务2 小时前
操作系统应用开发(二十八)rust OIDC服务器—东方仙盟筑基期
服务器·rustdesk·仙盟创梦ide·东方仙盟
杨云龙UP4 小时前
小工具大体验:rlwrap加持下的Oracle/MySQL/SQL Server命令行交互
运维·服务器·数据库·sql·mysql·oracle·sqlserver
阿巴~阿巴~4 小时前
使用 C 语言连接 MySQL 客户端(重点)
服务器·数据库·sql·mysql·ubuntu
白水先森4 小时前
Python 字符串与布尔值详解
java·服务器·前端
is08154 小时前
全志 H3 armbian 备份
linux·服务器·网络
Yefimov5 小时前
DPDK:从网络协议栈的角度来观察微内核
后端·网络协议