websocket服务器

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

#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 1024static 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 JSONstruct json_object *jobj, *jtype;jobj = json_tokener_parse(in);if (jobj == NULL) {printf("Error parsing JSON data\n");break;}// Get type fieldif (!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 joinif (strcmp(type, "join") == 0) {// Send response JSON with type joinchar *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 libwebsocketsstruct 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 serverstruct 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 establishedwhile (client_conn == NULL) {lws_service(context, 0);}printf("Connected to server\n");// Wait for data to be receivedwhile (true) {lws_service(context, 0);}lws_context_destroy(context);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】学习记录_14_线程

14 线程 14.1 线程和进程 进程是资源管理的最小单位&#xff0c;每个进程都有数据段、代码段和堆栈段&#xff0c;进程切换时都有复杂的上下文切换等动作。进程切换上下文时&#xff0c; 需要重新映射虚拟地址空间、进出OS内核、寄存器切换&#xff0c;还会干扰处理器的缓存机…

11408知识点集合

文章目录 一、数学(一) 高数0.初等数学补充1.函数、极限、连续2.导数3.中值定理4.积分5.微分方程6.空间解析几何7.多元微分8.重积分9.曲线曲面积分10.无穷级数11.其他杂记(二) 线代0.串联各章的等价条件1.行列式、矩阵的秩、矩阵的初等变换2.向量3.方程组、矩阵方程AXB4.特征值…

在 C 中打印字符串 - 如何在 C 中打印字符串

打印字符串是编程中的一项基本操作。它帮助您输出信息&#xff0c;检查和调试您的代码&#xff0c;并向用户显示提示信息。 在本文中&#xff0c;您将学习在 C 中打印字符串的一些不同技术。 &#xff08;本文视频讲解&#xff1a;java567.com&#xff09; 在 C 中字符串是什…

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

python_django中小学家校互动系统vue_flask家校联系

实现了一个完整的家校互动系统&#xff0c;其中主要有作业信息模块、学校管理员模块、学生学籍模块、学生成绩模块、学科模块、系统新闻模块、系统公告模块、校内新闻模块、校内公告模块、用户表模块、token表模块、关于我们模块、收藏表模块、年级模块、家长模块、教师模块、互…

【C++例8-2】 将单目运算符“++”重载为成员函数

课本里的例题&#xff0c;记录一下知识点 1.前置运算符返回值是Clock类引用&#xff0c;后置返回的是Clock类 前置是直接自增&#xff0c;然后参与运算&#xff0c;后置是先参与运算&#xff0c;再自增 ①所以前置可以直接改变&#xff0c;并返回引用&#xff0c;返回引用也…

Spark Standalone模式部署

准备至少2台虚拟机&#xff0c;装好linux系统&#xff0c;我装的是Ubuntu20.04。 1.修改主机名&#xff08;每台&#xff09; 1&#xff09;修改/etc/hostsname内容&#xff0c;主节点改为master&#xff0c;子节点改为slaver1 sudo vim /etc/hostname 2&#xff09;在/etc/…

如何通过外发文件控制,保障企业对核心业务数据的控制力?

外发文件控制是企业数据安全管理的重要组成部分&#xff0c;它涉及到对从企业内网向外发送的文件进行严格控制和管理&#xff0c;以防止敏感或机密信息的泄露。以下是常见的一些外发手段及问题&#xff1a; &#xff08;1&#xff09;IM通讯工具 如微信、QQ、企业微信、钉钉、…

4.0-Python列表(list)、元组(tuple)、字典(dict)和集合(set)详解

Python 序列&#xff08;Sequence&#xff09;是指按特定顺序依次排列的一组数据&#xff0c;它们可以占用一块连续的内存&#xff0c;也可以分散到多块内存中。Python 中的序列类型包括列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08…

如何通过文件外发管理系统,保护企业机密数据不外泄?

在互联网时代&#xff0c;企业与外界进行频繁的信息沟通已成为必要的一种业务模式&#xff0c;而在交互的过程中很可能会涉及到企业的相关敏感信息&#xff0c;一旦不慎流出就将会面临失控的风险。像员工在掌握了公司的关键信息后另起炉灶&#xff0c;设立同类型公司&#xff0…

C++中整型乘以0.01快还是除以100快?

相关代码及说明请见下文&#xff1a; int64_t mulFunc(int64_t a) {return (int64_t)(a * 0.01); }int64_t divFunc(int64_t a) {// 注意&#xff0c;除数必须是整型, 例如你不能把100改为100.0。如果你改了&#xff0c;计算速度将大幅下降(因为这样一来将计算过程变为浮点运算…

如何正确设计 TCP/IP 流式应用层网络协议

在我多年打黑工的职业生涯之中&#xff0c;除了在盛大游戏出身的半个老师&#xff08;做游戏服务器的&#xff09;曾今深入的教过我&#xff0c;关于正确的 TCP/IP 流式应用层网络协议的设计理念&#xff0c;前往其它公司打黑工、包括一些的开源项目&#xff0c;见识到的 TCP/I…

每个开发人员都应该知道的13个Nodejs库

Node.js&#xff0c;作为一种广受推崇的后端JavaScript环境&#xff0c;已成为众多网络开发者的首选。它不仅位列全球最流行编程语言之一&#xff0c;还通过JavaScript库的代码复用功能&#xff0c;极大地提升了项目开发效率。然而&#xff0c;面对众多选项&#xff0c;挑选合适…

mybatis快速入门-注解版

mybatis 使用注解&#xff0c;简化 xml 配置&#xff0c;汲及到动态 sql 或是多表查询&#xff0c;还是使用 xml 映射文件配置编写。(企业工作中&#xff0c;几乎全是 xml 配置&#xff0c;xml 的 sql 使用注解方式少,而类引用注解方式)。 注解 Select()&#xff1a;查询Inse…

Spring事务失效可能是哪些原因

典型回答 Spring中比较容易失效的就是通过Transactional 定义的声明式事务&#xff0c;他在以下几个场景中会导致事务失效&#xff0c;首先&#xff0c;就是Spring的Transactional是基于Spring的AOP机制实现的&#xff0c;而AOP机制又是基于动态代理实现的。那么如果代理失效了…

ArrayList与顺序表(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

归并排序精讲

一.定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子…

C++ 虚表起源

本文会让看不见 摸不着的虚表(Vtable),虚指针(Vptr)彻底现行 本文涉及思想: C 面向对象 封装 继承 多态 中的 多态 概念解释: 虚表指针&#xff1a; 这是指向虚表&#xff08;vtable&#xff09;的指针&#xff0c;虚表中包含了该类的所有虚函数对应的地址。 虚表&#x…

外贸客户开发有用的软件

外贸客户开发过程中&#xff0c;选择合适的软件工具能够显著提升效率和效果。以下是一些对外贸客户开发非常有用的软件&#xff1a; CRM系统&#xff1a; Salesforce&#xff1a;全球领先的CRM平台&#xff0c;提供强大的客户关系管理、市场分析、销售自动化等功能&#xff0c;…

vue基础语法学习

Object.defineProperty方法的使用 // 这是一个普通的对象 let phone {} // 给这个phone新增一个属性 三个参数&#xff1a;新增属性的对象&#xff0c;新增啥属性&#xff0c;属性值&#xff0c;key value对 Object.defineProperty(phone,color,{value:太空灰, //设置属性值wr…