lwip raw api接口 tcp_poll 使用,并给出从初始化到连接的例程
时间: 2024-10-23 22:16:40 浏览: 48
LwIP是一个轻量级TCP/IP协议栈,其raw API允许开发者直接访问底层网络数据包操作。`tcp_poll()`函数是用于管理多路复用I/O事件,它在等待多个TCP连接的状态变化时非常有用。
以下是使用LwIP `raw API` 和 `tcp_poll` 接口从初始化到建立TCP连接的基本步骤:
1. **初始化LwIP库**:
首先,需要包含必要的头文件并初始化LwIP堆栈:
```c
#include "lwip/opt.h"
#include "lwip/api.h"
void tcp_init() {
sysinit();
tcpip_init();
}
```
2. **创建套接字**:
创建一个RAW (原始) TCP套接字,这个套接字将用于发送和接收数据:
```c
struct tcp_pcb *pcb;
err_t err = tcp_new(&pcb);
if (err != ERR_OK) {
// 处理错误
}
```
3. **设置监听地址和端口**:
如果你想作为一个服务器接受连接,可以设置一个监听地址和端口:
```c
ip_addr_t local_ip = IPADDR_ANY; // 任意本地地址
err = tcp_bind(pcb, &local_ip, LWS_PORT);
if (err != ERR_OK) {
// 处理错误
}
tcp_set_recv_timeout(pcb, 1000); // 设置接收超时时间
```
4. **启动多路复用**:
初始化一个`poll()`结构并添加套接字到其中:
```c
struct pollfd fds[1];
fds[0].fd = pcb->rsock;
fds[0].events = POLLIN; // 监听读取事件
u8_t poll_events;
tcp_poll_init(pcb, &poll_events);
```
5. **开始监听和处理连接**:
进入一个无限循环,在这里你可以不断地调用`tcp_poll()`来检查套接字是否有新的连接请求:
```c
while (1) {
int timeout_ms = 500; // 等待500毫秒
int res = tcp_poll(fds, 1, timeout_ms);
if (res > 0) { // 有连接请求
// 处理新连接...
} else if (res == 0) { // 没有活动
continue;
} else { // 错误
break;
}
}
```
6. **处理连接**:
当检测到新连接时,你需要创建一个新的TCP PCB实例并连接到客户端:
```c
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
err = accept(pcb, (struct sockaddr *)&client_addr, &len);
if (err != ERR_OK) {
// 处理错误
}
// 对新连接的套接字进行处理...
```
7. **关闭和清理**:
结束后,记得释放资源:
```c
tcp_close(pcb);
tcp_poll_term(pcb);
```
注意:这只是一个基础示例,实际应用中可能还需要考虑异常处理、线程安全等因素。同时,LwIP的API可能会因为版本更新而有所变化,确保查看最新文档。
阅读全文