首页 > 其他分享 >libwebsocket demo以及遇到的坑。

libwebsocket demo以及遇到的坑。

时间:2024-08-29 20:03:52浏览次数:6  
标签:遇到 wsi demo len LWS client libwebsocket lws data

借鉴的 https://blog.csdn.net/qq_19004627/article/details/88737411

坑1:openssl报错:ip address mismatch(preverify_ok=0;err=64;depth=0),不确定是不是自己生成的证书在无网情况下是不是不可用(开发电脑无法连互联网),暂时屏蔽了openssl相关的代码。

坑2:这个文章的client的代码中的发送代码有中文“你好”,导致服务器解析异常,进而断链(这个问题,困扰了我几乎一整天)。暂时修改成非中文,如果一定要中文,需要转utf-8。

坑3:服务器的回显代码可以做下优化。如下所示,当data->len非零时再传输。

case LWS_CALLBACK_SERVER_WRITEABLE:   // 当此连接可写时
	{
		if (data->len != 0)
		{
			lws_write(wsi, &data->buf[LWS_PRE], data->len, LWS_WRITE_TEXT);
			data->len = 0;
		}
	} 

坑4:接收字符串打印乱码(直接打印in),可以在长度后面增加\0。

case LWS_CALLBACK_RECEIVE:           // 当接收到客户端发来的帧以后
										 // 判断是否最后一帧
		data->fin = lws_is_final_fragment(wsi);
		// 判断是否二进制消息
		data->bin = lws_frame_is_binary(wsi);
		// 对服务器的接收端进行流量控制,如果来不及处理,可以控制之
		// 下面的调用禁止在此连接上接收数据
		//lws_rx_flow_control(wsi, 0);
		// 业务处理部分,为了实现Echo服务器,把客户端数据保存起来
		memcpy(&data->buf[LWS_PRE], in, len);
		data->len = len;
		data->buf[LWS_PRE + data->len] = 0;
		lwsl_notice("recvied message:%s,len=%d\n", (char*)&data->buf[LWS_PRE], data->len);

		// 需要给客户端应答时,触发一次写回调
		lws_callback_on_writable(wsi);
		break;

  

 

其他今天搜寻了一天的资料的心得:

1、lws_write前面一定要预留LWS_PRE的空间,给lws内部使用,否则会崩溃。

2、如果报文很长,需要分片,需要判断lws_is_final_fragment,可以使用类似下面的代码:

case LWS_CALLBACK_RECEIVE:
 {
     Client * const client = (Client *)user;
     const size_t remaining = lws_remaining_packet_payload(wsi);
 
     if (!remaining && lws_is_final_fragment(wsi)) {
         if (client->HasFragments()) {
             client->AppendMessageFragment(in, len, 0);
             in = (void *)client->GetMessage();
             len = client->GetMessageLength();
         }
 
         client->ProcessMessage((char *)in, len, wsi);
         client->ResetMessage();
     } else
         client->AppendMessageFragment(in, len, remaining);
 }
 break;

3、客户端支持多连接到不同服务器,需要开多个线程去处理。

 

其他的一些可以参考https://blog.csdn.net/yetyongjin/article/details/131082375

 

标签:遇到,wsi,demo,len,LWS,client,libwebsocket,lws,data
From: https://www.cnblogs.com/xuhuajie/p/18387490

相关文章

  • 【ROS教程】用CLion编译和调试ROS包的全流程及可能遇到的问题
    @目录1.工作空间目录2.加载环境变量3.打开CLion4.配置CLion5.编译和调试软件包1.工作空间目录我们的一个工作空间目录应该是这样的2.加载环境变量先进入工作空间再加载source./devel/setup.bash3.打开CLion一定要在第二步的同一个终端下clion.sh如果打不开,......
  • 遇到ddos攻击怎么处理
    立即通知相关部门:在确认遭受DDoS攻击后,应立即联系网络服务提供商(ISP)或云服务提供商(CSP),他们可能提供DDoS防护服务或有能力协助处理。利用ISP和CSP的DDoS防护:许多ISP和CSP提供不同级别的DDoS防护。即使没有专业技术人员,也可以通过服务提供商了解和利用这些防护措施。启用DDoS防护......
  • saveBatch时 遇到Duplicate entry '1828978156126666754' for key
    问题:saveBatch时遇到Duplicateentry'1828978156126666754'forkey分析:1.检查数据库里是否有重复ID      2.检查代码中是否有id赋值     3.       以上排查都没发现问题,以下代码分析了一下,为了节省空间,我在for循环上面new了一个封装类,......
  • 【ROS教程】安装ROS全流程及可能遇到的问题
    @目录1.配置Softerware&Updates2.添加软件源3.设置key4.更新并安装4.1更新4.2安装(ros-noetic-desktop-full)4.2.1安装aptitude4.2.2安装ROS软件包5.添加环境变量6.安装构建依赖7.初始化和更新7.1初始化7.1.1目前可行的解决办法:重新定位资源7.1.2结果7.2更新1.配置Sof......
  • 基于springboot的grpc服务端demo
    1.Javamaven配置点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="h......
  • 【SQL练习】demo1
    为了适应技术发展的需求,SQL标准于2016年增加了以下JSON功能:JSON对象的存储与检索。将JSON对象表示成SQL数据。将SQL数据表示成JSON对象。如今,主流关系型数据库都增加了原生JSON数据类型和相关函数的支持,使得我们可以将SQL的强大功能与JSON文档存储的灵......
  • 【Python安全】demo1:模拟木马传播行为(谨慎使用)
    原创蓝胖子之家代码主要功能是将自身复制到系统目录,并将其写入注册表以实现开机启动。它还设置了一个定时器,用于定期执行一些操作。该程序还监听设备的插拔事件,并在可移动驱动器插入时将自身复制到驱动器上。具体来说,代码中的kill_process函数用于终止指定名称的进程。wnd_pr......
  • 【反沙箱系列】代码demo1
    一、判断CPU核心数dwNumberOfProcessors#include<iostream>#include<windows.h>intGetCPUCoreCount(){SYSTEM_INFOsysInfo;GetNativeSystemInfo(&sysInfo);returnsysInfo.dwNumberOfProcessors;}boolIsCPUCoreCountLessThanTwo(){......
  • PHPStudy 面板在使用过程中可能会遇到各种错误
    面板在使用过程中可能会遇到各种错误。这里列出一些常见的问题及其解决方法:启动问题启动失败描述:面板启动时失败,无法正常工作。解决方法:检查面板的日志文件,查找启动失败的具体原因。确认服务器资源是否足够。重新安装或更新到最新版本的PHPStudy。网站问题网......
  • JNI DEMO
       make.shjavac-h.HelloJNI.javag++-I"$JAVA_HOME/include"-I"$JAVA_HOME/include/dawin"-shared-olibhelloJNI.dylibHelloJNI.cppjavacHelloJNI.javajavaHelloJNI HelloJNI.javapublicclassHelloJNI{privatenative......