netconn_accept返回值为0,OSQCreate出错 lwip uocsii

我是在main中有创建信号量的函数

led_event = OSQCreate(&led_q[0] , MSGSIZE);

这个因为配置中信号量上限较小
而在sys_arch.c中有一个创建消息邮箱的函数

err_t sys_mbox_new
其中调用了:
(*mbox)->pQ=OSQCreate(&((*mbox)->pvQEntries[0]),size); //使用ucos创建一个消息队列

从上面可知lwip会隐含的创建了一些消息队列,如果上限不足会导致出错误。

增加os_cfg.h中如下宏定义:

define OS_MAX_EVENTS            20u   //事件的上限
define OS_MAX_QS                20u   //信号量的上限
define OS_MAX_TASKS             20u   //任务上限
当 `netconn_recv` 函数在指定的时间内未接收到任何数据时,它会返回错误代码 `ERR_TIMEOUT`[^1]。此行为表明接收操作已超出设定的超时时间,而并未实际接收到有效数据。 以下是关于如何配置和处理这种场景的相关说明: ### 配置接收超时 为了启用接收超时功能,需定义宏 `LWIP_SO_RCVTIMEO` 并将其设为 1。随后通过调用 `netconn_set_recvtimeout` 方法设置具体的超时时间(单位为毫秒)。例如: ```c #define LWIP_SO_RCVTIMEO 1 netconn_set_recvtimeout(conn, 60000); // 设置60秒超时 ``` 上述代码片段设置了 60 秒的接收超时时间。如果在此时间内没有接收到数据,则 `netconn_recv` 将返回 `ERR_TIMEOUT`。 ### 处理逻辑 当检测到 `ERR_TIMEOUT` 返回值时,可以采取相应的清理措施,比如断开连接、释放资源等。以下是一个简单的伪代码示例展示这一过程: ```c err_t res; struct netbuf *in_buf; res = netconn_recv(conn, &in_buf); if (res == ERR_OK) { // 正常接收数据后的处理流程 } else if (res == ERR_TIMEOUT) { // 超时处理逻辑 printf("Connection timed out\n"); netconn_close(conn); // 关闭连接 netconn_delete(conn); // 删除连接对象 } else { // 其他错误情况 } ``` ### 数据提取辅助方法 对于接收到的数据缓冲区 (`netbuf`) 的进一步处理,可以通过 `netbuf_data()` 提取其中的实际数据指针及其长度[^2]。这有助于解析具体的应用层协议内容。 #### 注意事项 - 若 `tcp_connect()` 在尝试建立连接过程中因内存不足无法排队 SYN 请求段,则可能返回 `ERR_MEM` 表明失败[^3]。 - 整体应用设计上应遵循典型的客户端服务模型,即利用 `netconn_new()` 创建新连接实例,绑定至目标端口进入监听模式,并借助 `netconn_accept()` 接收传入链接请求[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值