由于数据加密错误,本次会会话将结束

远程桌面数据加密错误的解决方法

转帖自【http://hi.baidu.com/istang/blog/item/3b54520eaa2136d97acbe139.html】【http://blog.sina.com.cn/s/blog_4aa148620100jh6o.html

远程桌面由于数据加密错误 
2011年02月15日 星期二 10:12
 

    在连接远程桌面的时候出现数据加密错误的提示,这种情况出现的原因有很多种。在网络上大家说的一般都是要修改注册表之类的,这些我没有试验,因为导致错误的原因不同解决方法有所区别。

    其中我遇到的一种导致出现数据加密错误情况的原因是这样的,我在服务器上安装有一个第三方的应用软件,由于在360安全卫士中发现会上传数据所以限制了它连接网络。在这之前远程连接是没有出现数据加密出错的情况的,当我限制第三方软件连接网络的时候我重新连接远程桌面就出现了前面提到的数据加密错误了,这也证实了我的猜测于是把限制连接网络取消之后一切恢复正常。

    原来设置第三方软件限制接入网络是出于保护远程主机的考虑,防止上传隐私信息。结果是出现了这样的异常状况。当然其他原因引起的远程桌面数据加密错误的要根据情况不同进行解决了。
 

====================
由于数据加密错误,本次会会话将结束...... (2010-06-24 09:22:48)转载标签: 由于数据加密错it  
Windows 2003 远程桌面报告由于数据加密错误,本次会话将结束... ....
遇到这个故障其实很久了,一直没有解决到,后来得网盟的一位网友指点完美解决这个故障了
再次感谢这位网友

 


我试过网上所有的方法都无效,比如修改注册表,删除某个键值,替换文件,禁用映射打印机,修改rdp

数量等等,所以你也可以不用去试验了,都是骗人的


解决方法很简单,把你禁用的防火墙服务设为自动和运行它,打开你的通讯网卡,网卡属性里面停止防火

墙。完了就这么简单,还是看不懂的,可以联系我的QQ785717621

<think> 我们正在讨论的是libwebsockets中的`lws_write`函数在处理大数据量发送时的方法。根据之前的内容,我们知道当一次发送的数据量较大时,可能会遇到部分写入的情况(即返回值小于期望发送的长度)。此时需要分多次发送,并利用可写事件回调机制。 用户的问题:我想了解lws_write在发送大数据量时的处理方式。 根据引用[1]:如果消息超过初始化设置的大小(发送缓冲区大小),消息会分片,分片的消息需要自行处理,在callback中的`LWS_CALLBACK_SERVER_WRITEABLE`事件中处理剩下的报文。 引用[3]中详细说明了`lws_write`的用法,特别指出: - 发送的数据缓冲区前后需要预留空间(LWS_PRE和LWS_POST_PADDING) - 在部分写入的情况下,需要保存剩余数据,并通过`lws_callback_on_writable`请求可写事件,然后在下一次可写事件中继续发送。 因此,处理大数据量发送的核心是: 1. 将大数据分割成合适的大小(通常不超过初始化时设置的发送缓冲区大小减去LWS_PRE和LWS_POST_PADDING)。 2. 使用`lws_write`发送,如果返回部分写入,则保存剩余数据,并调用`lws_callback_on_writable`请求下一次可写事件。 3. 在可写事件回调中继续发送剩余数据,直到全部发送完成。 下面详细说明步骤: ### 1. 准备数据并考虑发送缓冲区限制 在发送之前,需要将数据分割成块,每块的大小应满足: $$块大小 \leq (发送缓冲区大小 - LWS\_PRE - LWS\_POST\_PADDING)$$ 通常,我们会在每个数据块前预留`LWS_PRE`字节(通常为4字节)的头部空间,因此实际发送时指针要偏移`LWS_PRE`。 ### 2. 发送数据块 调用`lws_write`发送当前块: ```c int sent = lws_write(wsi, buffer + LWS_PRE, chunk_len, LWS_WRITE_TEXT); ``` ### 3. 处理部分写入 如果`sent`小于`chunk_len`,则说明当前只发送了部分数据,剩余部分需要保存,并请求可写事件: ```c if (sent < chunk_len) { // 保存剩余数据(这里需要将未发送的部分保存起来,并记录剩余长度) // 注意:必须保存整个未发送的数据块,因为原缓冲区可能被覆盖 // 假设我们在会话数据结构中定义了剩余数据指针和长度 pss->unsent_data = buffer + LWS_PRE + sent; // 剩余数据的起始位置 pss->unsent_len = chunk_len - sent; // 剩余数据长度 // 请求可写事件 lws_callback_on_writable(wsi); // 注意:这里不能继续发送,必须等待可写事件 } ``` ### 4. 在可写事件回调中继续发送 当可写事件触发(即`LWS_CALLBACK_SERVER_WRITEABLE`事件)时,继续发送剩余数据: ```c case LWS_CALLBACK_SERVER_WRITEABLE: if (pss->unsent_len > 0) { // 继续发送剩余数据 int ret = lws_write(wsi, (unsigned char*)pss->unsent_data, pss->unsent_len, LWS_WRITE_TEXT); if (ret > 0) { pss->unsent_data += ret; pss->unsent_len -= ret; if (pss->unsent_len > 0) { // 如果还有剩余,继续请求可写事件 lws_callback_on_writable(wsi); } else { // 全部发送完成,可以清理资源 } } else if (ret < 0) { // 发送错误处理(如连接已关闭) } } break; ``` ### 5. 注意事项 - **数据缓冲区管理**:确保在多次发送过程中,保存剩余数据指针所指向的内存区域是有效的(例如,使用堆内存或静态存储区,避免使用栈上的临时缓冲区)。 - **流量控制**:引用[3]中提到,可以通过`lws_get_peer_write_allowance`和`lws_send_pipe_choked`来检查当前连接是否允许发送以及允许发送的字节数,避免发送过多导致阻塞。 - **分块策略**:对于非常大的数据(如文件),建议采用流式发送,即每次只准备一块数据发送,发送完一块再准备下一块,而不是一次性将整个文件读入内存。 ### 6. 发送超大文件的优化 - 使用文件描述符和内存映射(mmap)来避免将整个文件读入内存。 - 每次读取文件的一部分(例如,每次读取4KB),然后发送,并保存文件偏移量,在可写事件中继续读取并发送下一部分。 ### 总结 处理大数据量发送的关键在于分块发送和部分写入的处理。通过`lws_callback_on_writable`事件驱动机制,可以高效地完成大数据的分片发送,同时避免阻塞事件循环。 §§相关问题§§ 1. 如何确定合适的发送块大小? 2. 使用`lws_write`发送数据时,如何避免内存拷贝? 3. 如何通过流量控制函数优化大数据发送? 4. 在发送文件时,如何避免频繁的磁盘IO? [^1]: 消息分片处理 [^3]: `lws_write`详细说明 </think>### `lws_write` 大数据量发送的处理方式 当使用 `lws_write` 发送大数据量时(超过单次发送缓冲区限制),需通过**分片发送**机制处理。核心流程如下: #### 1. **分片发送流程 ```mermaid graph TD A[原始数据] --> B{数据长度 > 发送缓冲区?} B -->|是| C[切割为多个数据块] B -->|否| D[直接调用 lws_write] C --> E[依次发送每个数据块] E --> F{出现部分写入?} F -->|是| G[保存剩余数据<br>lws_callback_on_writable] F -->|否| H[继续发送下一块] ``` #### 2. **关键技术实现 ```c // 在会话数据结构中保存发送状态 struct per_session_data { const char *send_ptr; // 当前发送位置指针 size_t total_len; // 数据总长度 size_t sent_len; // 已发送长度 }; // 初始化发送(示例) void init_send(struct per_session_data *pss, const char *data, size_t len) { pss->send_ptr = data + LWS_PRE; // 跳过LWS_PRE预留头[^3] pss->total_len = len; pss->sent_len = 0; lws_callback_on_writable(wsi); // 触发首次发送 } // 可写事件回调处理 case LWS_CALLBACK_SERVER_WRITEABLE: { size_t remain = pss->total_len - pss->sent_len; if (remain > 0) { // 计算本次发送量(不超过缓冲区限制) size_t chunk_size = MIN(remain, MAX_SEND_SIZE); int sent = lws_write(wsi, (unsigned char*)pss->send_ptr, chunk_size, LWS_WRITE_BINARY // 二进制数据使用LWS_WRITE_BINARY ); if (sent > 0) { pss->sent_len += sent; pss->send_ptr += sent; if (pss->sent_len < pss->total_len) { lws_callback_on_writable(wsi); // 继续请求下一次发送[^3] } } else if (sent < 0) { // 处理发送错误 } } break; } ``` #### 3. **关键注意事项 1. **缓冲区预留空间** - 发送缓冲区前必须预留 `LWS_PRE` 字节(通常4字节)[^3] - 错误示例:`lws_write(wsi, raw_data, len, ...)` ❌ - 正确示例:`lws_write(wsi, raw_data + LWS_PRE, len, ...)` ✅ 2. **流量控制** 通过以下API避免拥塞: ```c if (lws_send_pipe_choked(wsi)) { // 检查是否阻塞[^3] lws_callback_on_writable(wsi); // 等待下次可写事件 return 0; } ``` 3. **大数据优化策略** - **文件发送**:使用 `sendfile()` 系统调用避免内存拷贝 - **零拷贝**:通过 `LWS_WRITE_HTTP` 标志发送文件描述符 - **分块编码**:HTTP场景启用 `chunked transfer` 4. **协议类型选择** - 首次发送:`LWS_WRITE_BINARY` 或 `LWS_WRITE_TEXT` - 后续分片:保持相同类型 - 结束帧:`LWS_WRITE_CONTINUATION`(WebSocket场景) #### 4. **性能优化建议 - **动态分片大小**:根据 `lws_get_peer_write_allowance()` 返回值调整每次发送量[^3] - **内存池管理**:为大数据分配独立内存池,避免频繁分配释放 - **异步IO**:多线程场景使用信号量同步生产/消费[^2] > **为什么必须分片?** > libwebsockets 的发送缓冲区大小有限(默认4K[^1]),超过限制的数据会被底层TCP栈拆分。主动分片可避免: > 1. 不可控的TCP分片延迟 > 2. SSL/TLS加密带来的额外缓冲 > 3. 阻塞事件循环导致吞吐量下降
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值