演示使用 lwIP 非阻塞 Socket 同时向 www.baidu.com 发起多个并发 TCP 连接,通过 select 事件驱动方式处理连接完成和可读事件。
预期行为
- 等待蜂窝网络就绪
- 创建消息队列和 handler_task 工作线程
- DNS 解析 www.baidu.com
- 批量创建 MAX_CONNECTIONS (默认 10 )个非阻塞 Socket,全部发起连接
- 在 select 循环中处理:
- **异常事件**:关闭对应 Socket
- **可写事件**(连接中):通过 SO_ERROR 确认连接成功,更新状态为已连接,发送 HEAD / HTTP/1.1 请求
- **可读事件**(已连接):将 Socket 推入消息队列交给 handler_task 处理
- handler_task 接收 HTTP 响应头并打印,然后关闭 Socket
- 所有连接处理完毕后退出 select 循环
**日志输出示例**:
resolving domain: www.baidu.com
DNS resolved success.
--- Non-Blocking Multi-Connect (10) ---
fd[0] connecting in progress ...
...
--- Select Loop ---
[Event] fd[0]: connected!
[Loop] fd[0]: error, closing
[Event] fd[1]: is readable. sending to HANDLER, stopping monitor
[HANDLER] fd[1]: Rx Data (xxx bytes):
HTTP/1.1 200 OK
...
编译和运行
cd examples/network/socket-nonblock
xt --target lm620/r4f4 fullclean build
注意事项
- 依赖 lwip 平台私有组件,仅支持 lm620 平台
- 本示例使用 lwIP 原生 API( lwip_socket / lwip_fcntl / lwip_select 等),不是跨平台的 xt_socket(跨平台 Socket)
- 可调整 MAX_CONNECTIONS (最大并发数)和 MSG_QUEUE_SIZE (消息队列深度)
- 每个连接仅处理一次请求和响应,收到数据后即从 select 监控列表中移除