乐鑫技术交流
直播中

李志静

8年用户 1502经验值
私信 关注
[问答]

请问使用lwip创建socket,该如何做到非阻塞的接收发送数据?

请问使用lwip创建socket,该如何做到非阻塞的接收发送数据?
                     

回帖(1)

李平

2024-6-19 16:18:24
LwIP 是一个轻量级的 TCP/IP 协议栈,广泛用于嵌入式系统。要在 LwIP 中创建非阻塞的 socket,您可以遵循以下步骤:

1. 初始化 LwIP 协议栈:在您的应用程序中,首先需要初始化 LwIP 协议栈。这通常通过调用 `lwip_init()` 函数完成。

2. 创建 socket:使用 `lwip_socket()` 函数创建一个 socket。例如,如果您要创建一个 TCP socket,可以这样调用:
   ```c
   int s = lwip_socket(AF_INET, SOCK_STREAM, 0);
   ```

3. 设置 socket 为非阻塞模式:使用 `lwip_fcntl()` 函数设置 socket 的非阻塞属性。例如:
   ```c
   u8_t non_blocking = 1;
   lwip_fcntl(s, F_SETFL, non_blocking);
   ```

4. 绑定 socket:使用 `lwip_bind()` 函数将 socket 绑定到一个本地地址和端口。例如:
   ```c
   struct sockaddr_in local_addr;
   local_addr.sin_family = AF_INET;
   local_addr.sin_port = htons(local_port);
   local_addr.sin_addr.s_addr = INADDR_ANY;

   lwip_bind(s, (struct sockaddr *)&local_addr, sizeof(local_addr));
   ```

5. 监听连接(对于服务器端):如果这是一个服务器端的 socket,使用 `lwip_listen()` 函数开始监听连接。例如:
   ```c
   lwip_listen(s, backlog);
   ```

6. 接受连接(对于服务器端):使用 `lwip_accept()` 函数接受客户端连接。由于设置了非阻塞模式,此函数在没有连接可接受时将立即返回 -1,而不是阻塞等待连接。例如:
   ```c
   int client_socket = lwip_accept(s, NULL, NULL);
   if (client_socket == -1) {
       // 没有连接可接受,可以继续执行其他任务
   }
   ```

7. 发送和接收数据:使用 `lwip_send()` 或 `lwip_write()` 函数发送数据,使用 `lwip_recv()` 或 `lwip_read()` 函数接收数据。由于设置了非阻塞模式,这些函数在没有数据可发送或接收时将立即返回 -1。例如:
   ```c
   char buffer[1024];
   int bytes_sent = lwip_send(client_socket, buffer, sizeof(buffer), 0);
   if (bytes_sent == -1) {
       // 发送失败,可以继续执行其他任务
   }

   int bytes_received = lwip_recv(client_socket, buffer, sizeof(buffer), 0);
   if (bytes_received == -1) {
       // 接收失败,可以继续执行其他任务
   }
   ```

8. 关闭 socket:当不再需要 socket 时,使用 `lwip_close()` 函数关闭它。
   ```c
   lwip_close(s);
   ```

通过以上步骤,您可以在 LwIP 中创建非阻塞的 socket 并进行数据的发送和接收。请注意,由于非阻塞模式下 socket 操作可能立即返回 -1,您需要在应用程序中适当地处理这种情况。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分