NXP MCU 技术论坛
直播中

王波

7年用户 1416经验值
私信 关注
[问答]

如何在iMXRT1176上的LwIP中使用TCP套接字?

我们使用了 lwip_ping_freertos_cm7 示例。该示例运行良好,即它正在 ping 主机设备。
我的理解是——
1) lwip_ping_bm 示例使用原始 API(即非操作系统使用原始 API)
2) OS模式可以使用Socket API和Raw API
3) lwip_ping_freertos 示例使用套接字 API
我的问题是,在创建套接字期间,它使用 SOCK_RAW 作为套接字类型,使用 ICMP 作为套接字协议。
          lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP);
我想将 SOCK_STREAM 创建为使用 TCP 协议的套接字类型。但是如果我直接修改它,它会给我错误。
我的要求是将以太网与普通的 tcp/ip 服务器-客户端示例一起使用。但是上面的代码使用了用于 UDP 传输的 sendto() , recvfrom() API。你能帮我,在哪里修改代码?

回帖(1)

刘勇

2024-1-13 14:58:09
要在 iMXRT1176 上的 LwIP 中使用 TCP 套接字,您需要使用以下步骤:

1.使用 lwip_init() 函数初始化 LwIP 和网络接口。

2.使用 lwip_socket() 函数创建 TCP 套接字。示例代码如下:

```c
int sock = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
```

其中,AF_INET 表示 IPv4 协议族,SOCK_STREAM 表示创建 TCP 套接字,IPPROTO_TCP 表示使用 TCP 协议。

3.使用 lwip_bind() 函数将套接字绑定到本机 IP 地址和端口号。示例代码如下:

```c
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(PORT);

lwip_bind(sock, (struct sockaddr*)&addr, sizeof(addr));
```

其中,INADDR_ANY 表示使用任意可用的 IP 地址,PORT 是所选的本地端口号。

4.使用 lwip_listen() 函数开始监听传入连接请求。示例代码如下:

```c
lwip_listen(sock, 5);
```

其中,第二个参数 5 表示在队列中排队等待的最大连接数。

5.使用 lwip_accept() 函数接受传入的连接请求。示例代码如下:

```c
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);

int client_sock = lwip_accept(sock, (struct sockaddr*)&client_addr, &client_addr_len);
```

其中,client_addr 是指向客户端地址的指针,并且 client_addr_len 是该结构体的大小。

6.使用 lwip_recv() 和 lwip_send() 函数接收和发送数据。示例代码如下:

```c
char buf[1024];
int len = lwip_recv(client_sock, buf, sizeof(buf), 0);
lwip_send(client_sock, buf, len, 0);
```

其中,第一个参数是套接字描述符,第二个参数是接收和发送的数据缓冲区,第三个参数是缓冲区的大小,第四个参数是标志位。

7.最后,使用 lwip_close() 函数关闭套接字。示例代码如下:

```c
lwip_close(client_sock);
lwip_close(sock);
```

请注意,上述代码只是示例,并且您需要根据您的具体需求进行修改和调整。
举报

更多回帖

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