网上很多关于websocket发送数据大于大于0xFFFF(65535)的处理都是一句话“暂不处理”!!!!!所以特写此文。

int WSSession::safeSendFrame(uint8_t *buffer, size_t bufferSize, enum wsFrameType frameType) 
{
// 发数据到浏览器需要封装一个websocket的头,但wsMakeFrame()函数存在内存拷贝,会消耗性能,
// 所以这里分两步发:1、发websocket头,2、发实际数据。

// 构造websocket头
uint8_t wsMakeFrameHead[20] = {0};
size_t FrameHeadLen = 0;
assert(frameType < 0x10);
if (bufferSize > 0)
assert(buffer);

wsMakeFrameHead[0] = 0x80 | frameType;

if (bufferSize <= 125) {
wsMakeFrameHead[1] = bufferSize;
FrameHeadLen = 2;
} else if (bufferSize <= 0xFFFF) {
wsMakeFrameHead[1] = 126;
uint16_t payloadLength16b = htons(bufferSize);
memcpy(&wsMakeFrameHead[2], &payloadLength16b, 2);
FrameHeadLen = 4;
} else {
//        assert(dataLength <= 0xFFFF);

//implementation for 64bit systems
/*wsMakeFrameHead[1] = 127;
uint64_t lenHigh32b = htonl((bufferSize>>32)& 0xFFFFFFFF);
uint64_t lenLow32b = ((uint64_t)htonl(bufferSize&0xFFFFFFFF)) << 32;

uint64_t payloadLength64b = lenHigh32b | lenLow32b;
memcpy(&wsMakeFrameHead[2], &payloadLength64b, 8);
FrameHeadLen = 10;*/

wsMakeFrameHead[1] = 127;
wsMakeFrameHead[2] = 0;
wsMakeFrameHead[3] = 0;
wsMakeFrameHead[4] = 0;
wsMakeFrameHead[5] = 0;
wsMakeFrameHead[6] = (byte)(bufferSize >>24);
wsMakeFrameHead[7] = (byte)(bufferSize >>16);
wsMakeFrameHead[8] = (byte)(bufferSize >>8);
wsMakeFrameHead[9] = (byte)(bufferSize & 0xFF);
FrameHeadLen = 10;
}

// 发websocket头
int nRetH = safeSend(wsMakeFrameHead, FrameHeadLen);

// 发实际数据
int nRetD = safeSend(buffer, bufferSize);

if (nRetH != EXIT_SUCCESS || nRetD != EXIT_SUCCESS)
return EXIT_FAILURE;
return EXIT_SUCCESS;
}

websocket 发送数据大于0xFFFF(65535)的处理相关推荐

  1. C# 实现读取电子秤数据-通过websocket发送数据给本地网页

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 解析rosbag数据并使用websocket发送到客户端

    效果: 20220711_170906 服务端: import json,asyncio,websockets,rosbag from sensor_msgs import point_cloud2p ...

  3. html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件

    PCM格式 通过websocket发送音频数据. <html> <head><meta charset="utf-8"><title> ...

  4. 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...

  5. netty客户端连接后无限发送数据,连接不上时无限重试,断线重连

    在之前的netty文章里,刚开始学,利用netty实现websocket写了一个聊天程序. 纯netty实现http,websocket协议,头像上传,搭建实时聊天室,群聊,私聊,文字,图片消息 本文 ...

  6. netty发送数据_【Netty】JAVA IO模型

    为什么要学Netty? 其实我们每学一样东西,就要了解学这个的必要性.那么为什么要学Netty呢. 其实但凡涉及网络通信就必然离不开网络编程.Netty目前作为JAVA网络编程最热门的框架,毫不夸张的 ...

  7. Kafka Sender线程如何发送数据

    文章目录 1.内存缓冲中的Batch,如何被判定可发送出去 2.标识那些元数据未拉取成功的 3.检查筛选出来的Broker是否可以发送数据 3.1 元数据是否已经就位 3.2 是否可以发送请求 3.3 ...

  8. Android,使用Json发送数据中,使用的Java转义字符 KanKan原创

    kankan原创 与php后台发送数据的时候.要求用到这样的格式. private void sendJson(){ //初始化自己定义的handler CashHandler handler = n ...

  9. html5 websocket发送图片,通过WebSocket连接,实现Image从服务器到浏览器的传输

    通过WebSocket链接,网页和服务端可以实现异步双向通讯.这里介绍如何从服务端获取一张图片,然后传输到网页中显示出来. 参考原文: 准备工作 创建WebSocket Server 创建一个WinF ...

最新文章

  1. ((ios开发学习笔记九)) Simple TableView 实现(附 实例源码)
  2. 从地理分类的计算机网格,第2章-地理空间象计算机表达(6-9学时).doc
  3. AMDKFD 合并入 Linux 3.19 内核
  4. JS无法获取display为none的隐藏元素的宽度和高度的解决方案
  5. 002-layui颜色
  6. 打造增长核武器:承载与创造科技公司70%价值的「网络效应」
  7. window中搭建jenkins_Windows环境中的jenkins构建时报错
  8. 【Redis】Linux下Redis安装与redis-desktop-manager使用(无法连接Redis服务器解决方法)...
  9. ASP.NET中实现模版的动态加载
  10. 翻译题(map使用)
  11. 华硕 WL-566gM之信号强度
  12. java取得当前日期增加一天或多天
  13. JavaScript 图片切割效果
  14. cmd的注释符号是什么?
  15. 英特尔芯片组 年代表_英特尔:对不起,但我们的7纳米芯片将延迟到2022年,2023年
  16. 华为EMUI10基本可以升鸿蒙,华为EMUI11发布,12月可升级为鸿蒙OS国产操作系统
  17. Redis 客户端使用与监控
  18. SpringBoot:Bean生命周期介绍
  19. web端接入微信小程序扫码进行登录
  20. Python Scrapy使用实例讲解

热门文章

  1. Shell 编程实践
  2. 阿里云国际站实名认证上传材料填写样例(域名持有者为组织)
  3. 苹果编程语言Swift解析:将推动应用开发巨变
  4. 为什么看不到局域网其他计算机名,windows10系统局域网看不到计算机名怎么办
  5. 单片机理论篇(未完成)
  6. vue3 setup语法糖与原始写法对比
  7. MID-TERM EXAMINATION 1
  8. linux系统制作qcow2,制作qcow2镜像
  9. 如何在oracle官网下载ojdbc8,想不想在maven里直接下载ojdbc这个jar?
  10. Tomcat跨域配置