19-存储篇之单机存储(2)_ev 没用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

内附详细安装教程,亲测搭建无问题。 一、乐步交易流程----购买乐步糖果 方法一:在卖方市场选择合适的卖家或者用手机号定向查询特定卖家 步骤一:点击首页下方【交易中心】。 步骤二:点击【卖单列表】,选择合适的卖家或者用手机号搜索特定卖家,确定卖家之后点击该卖家后方的【购买】。 步骤三:点击之后,系统会显示该卖家的收款信息。按照系统显示的收款信息付款,(付款备注交易订单号)付款完成之后上传凭证,等待卖家确认收款并且支付糖果。 方法二:挂单买入糖果 步骤一:点击首页下方【交易中心】。 步骤二:点击【买单列表】--【发布买单】,填写购买糖果单价、数量、交易密码,点击【确定】,买单发布,等待匹配成交。 二、乐步交易流程----出售乐步糖果 方法一:在买方市场选择合适的买家或者用手机号定向查询特定买家 步骤一:点击首页下方【交易中心】。 步骤二:点击【买单列表】,选择合适的买家或者用手机号搜索特定买家,确定买家之后点击该买家后方的【出售】。 步骤三:点击之后,系统会提示买家付款,买家按照系统提示的账号给卖家付款(付款备注交易订单号),付款完成之后上传凭证,等待卖家确定并且支付糖果。 方法二:挂单卖出糖果 步骤一:点击首页下方【交易中心】。 步骤二:点击【卖单列表】--【发布卖单】,填写出售糖果单价、数量、验证码、交易密码,点击【确定】,卖单发布,等待匹配成交。
<think>好的,用户提供了一个日志条目,涉及_ic_mqttv2_mgcb的MG_EV_WRITE和MG_EV_ERROR事件,错误码11,错误信息是“Resource temporarily unavailable”。我需要分析可能的原因和解决方法。 首先,了解上下文。MQTT协议常用于物联网设备通信,使用库如mongoose或类似。日志中的MG可能指mongoose库的事件。错误码11对应系统错误EAGAIN,即资源暂时不可用,通常在非阻塞操作中发生。 步骤一:确认错误码。错误码11在Unix系统是EAGAIN,非阻塞操作无法立即完成,需重试。检查代码中是否处理了EAGAIN情况,比如写操作时缓冲区满,应等待可写事件再继续。 步骤二:分析MG_EV_WRITE和MG_EV_ERROR的关系。MG_EV_WRITE表示可以写入数据,可能在写入时遇到错误,触发MG_EV_ERROR。可能原因包括网络问题、对方关闭连接、缓冲区满或资源限制。 步骤三:具体可能原因。网络不稳定导致发送失败;接收方处理慢,TCP窗口满,发送缓冲区满;文件描述符不足或内存不足;对方主动断开,继续写入导致错误。 解决建议:检查网络连接稳定性;确认接收方状态和处理能力;增加发送缓冲区大小;处理EAGAIN错误,重试写入;检查资源限制,如ulimit设置;启用详细日志,观察其他相关事件;查阅mongoose文档或社区,确认是否有已知问题或配置建议。 需要确保回答结构清晰,分点列出原因和解决方法,用中文,避免Markdown格式,行内公式用$...$,独立公式用$$...$$,但用户问题不涉及数学公式,可能不需要使用。注意检查是否需要LaTeX,这里可能不需要,但保持准备。</think>你提供的日志条目涉及MQTT客户端库(可能基于mongoose网络库)中的错误报告,具体为`MG_EV_ERROR`事件,错误码11对应系统错误“Resource temporarily unavailable”(资源暂时不可用)。以下是逐步分析及可能原因: --- ### **1. 错误背景解析** - **代码上下文**:`_ic_mqttv2_mgcb` 是MQTT客户端的事件回调函数,`MG_EV_WRITE`表示尝试向网络写入数据时触发了错误。 - **错误码11**:对应Unix系统的`EAGAIN`(或`EWOULDBLOCK`),属于非阻塞I/O操作中的常见错误,表明请求的操作无法立即完成,需稍后重试。 --- ### **2. 具体原因分析** #### **可能原因1:网络缓冲区已满** - 当TCP发送缓冲区满时,非阻塞写入操作会返回`EAGAIN`。 - **触发场景**: - 网络延迟高或接收方处理速度慢,导致数据积压。 - 发送数据速率超过网络带宽或接收方处理能力。 #### **可能原因2:资源限制** - 系统资源不足(如文件描述符、内存)导致无法分配资源完成操作。 - **检查方向**: - 使用`ulimit -n`确认进程允许的最大文件描述符数量。 - 监控内存使用情况(如`free -m`)。 #### **可能原因3:连接异常中断** - 对端(MQTT Broker)意外关闭连接,但客户端仍尝试写入数据。 - **验证方法**: - 检查Broker日志,确认连接状态。 - 捕获`MG_EV_CLOSE`事件判断连接是否已断开。 #### **可能原因4:代码未正确处理EAGAIN** - 未在写入失败时注册等待可写事件的重试逻辑,导致持续报错。 - **代码逻辑示例**: ```c if (write_result == MG_IO_WAIT) { // 注册等待可写事件,稍后重试 mg_io_wait(fd, MG_IO_WRITE); } ``` --- ### **3. 解决方案** #### **(1) 优化网络和缓冲区** - **调整TCP缓冲区大小**: ```bash sysctl -w net.ipv4.tcp_wmem="4096 16384 4194304" # 最小、默认、最大缓冲区 ``` - **降低发送速率**:通过QoS或流量控制避免突发数据。 #### **(2) 增强错误处理逻辑** - 在回调函数中捕获`EAGAIN`后,等待`MG_EV_WRITE`事件再重试发送: ```c void mg_cb(struct mg_connection *c, int ev, void *ev_data) { if (ev == MG_EV_WRITE) { // 重试之前失败的数据发送 } else if (ev == MG_EV_ERROR) { // 处理错误,如记录日志或重建连接 } } ``` #### **(3) 监控和调试** - **启用详细日志**:在库中开启调试模式(如设置`MG_ENABLE_DEBUG=1`),观察完整事件流。 - **网络抓包**:使用`tcpdump`或Wireshark分析TCP层交互,确认是否存在丢包或RST包。 --- ### **4. 扩展验证** - **模拟测试**:在本地环境复现高负载场景,验证错误是否与资源竞争相关。 - **版本兼容性**:检查MQTT客户端库与Broker(如Mosquitto、EMQX)的版本兼容性。 --- 若问题仍存,建议提供完整的代码片段和网络环境信息,以便进一步定位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值