websocket 发送数据大于0xFFFF(65535)的处理
网上很多关于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)的处理相关推荐
- C# 实现读取电子秤数据-通过websocket发送数据给本地网页
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 解析rosbag数据并使用websocket发送到客户端
效果: 20220711_170906 服务端: import json,asyncio,websockets,rosbag from sensor_msgs import point_cloud2p ...
- html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件
PCM格式 通过websocket发送音频数据. <html> <head><meta charset="utf-8"><title> ...
- 嵌入式作业STM32采用串口DMA方式发送数据
目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...
- netty客户端连接后无限发送数据,连接不上时无限重试,断线重连
在之前的netty文章里,刚开始学,利用netty实现websocket写了一个聊天程序. 纯netty实现http,websocket协议,头像上传,搭建实时聊天室,群聊,私聊,文字,图片消息 本文 ...
- netty发送数据_【Netty】JAVA IO模型
为什么要学Netty? 其实我们每学一样东西,就要了解学这个的必要性.那么为什么要学Netty呢. 其实但凡涉及网络通信就必然离不开网络编程.Netty目前作为JAVA网络编程最热门的框架,毫不夸张的 ...
- Kafka Sender线程如何发送数据
文章目录 1.内存缓冲中的Batch,如何被判定可发送出去 2.标识那些元数据未拉取成功的 3.检查筛选出来的Broker是否可以发送数据 3.1 元数据是否已经就位 3.2 是否可以发送请求 3.3 ...
- Android,使用Json发送数据中,使用的Java转义字符 KanKan原创
kankan原创 与php后台发送数据的时候.要求用到这样的格式. private void sendJson(){ //初始化自己定义的handler CashHandler handler = n ...
- html5 websocket发送图片,通过WebSocket连接,实现Image从服务器到浏览器的传输
通过WebSocket链接,网页和服务端可以实现异步双向通讯.这里介绍如何从服务端获取一张图片,然后传输到网页中显示出来. 参考原文: 准备工作 创建WebSocket Server 创建一个WinF ...
最新文章
- ((ios开发学习笔记九)) Simple TableView 实现(附 实例源码)
- 从地理分类的计算机网格,第2章-地理空间象计算机表达(6-9学时).doc
- AMDKFD 合并入 Linux 3.19 内核
- JS无法获取display为none的隐藏元素的宽度和高度的解决方案
- 002-layui颜色
- 打造增长核武器:承载与创造科技公司70%价值的「网络效应」
- window中搭建jenkins_Windows环境中的jenkins构建时报错
- 【Redis】Linux下Redis安装与redis-desktop-manager使用(无法连接Redis服务器解决方法)...
- ASP.NET中实现模版的动态加载
- 翻译题(map使用)
- 华硕 WL-566gM之信号强度
- java取得当前日期增加一天或多天
- JavaScript 图片切割效果
- cmd的注释符号是什么?
- 英特尔芯片组 年代表_英特尔:对不起,但我们的7纳米芯片将延迟到2022年,2023年
- 华为EMUI10基本可以升鸿蒙,华为EMUI11发布,12月可升级为鸿蒙OS国产操作系统
- Redis 客户端使用与监控
- SpringBoot:Bean生命周期介绍
- web端接入微信小程序扫码进行登录
- Python Scrapy使用实例讲解