lwip_read函数
时间: 2024-06-24 08:02:25 浏览: 9
LwIP(Lightweight IP)是一个小型的嵌入式TCP/IP协议栈,它被设计用于资源受限的设备,如微控制器。`lwip_read`是LwIP库中与网络输入数据相关的函数,通常用于从网络套接字(socket)接收数据。
`lwip_read(socket, buffer, len)` 函数的基本用法如下:
- `socket`:指向已经打开的网络连接的套接字描述符。
- `buffer`:一个预分配的内存区域,用来存放从网络读取的数据。
- `len`:想要读取的最大字节数。
这个函数的主要作用是从连接的网络源处读取指定长度的数据,将其存储到`buffer`中。如果实际读取的数据小于`len`,则可能是因为数据包大小、网络错误或已到达数据流的末尾。函数返回实际读取到的字节数。
相关问题
lwip echo server详解
lwIP(Lightweight IP)是一个轻量级的开源TCP/IP协议栈,它被设计为可移植、可扩展和高度定制化,适用于各种嵌入式系统。其中,echo server是lwIP协议栈中比较基本的一个应用。
Echo server的作用是将接收到的数据原样返回给发送方。在lwIP中,echo server是由一个名为echod的应用程序实现的。下面,我将详细介绍lwIP echo server的实现流程。
1. 创建socket
首先,我们需要创建一个socket,用于监听客户端的连接请求。在lwIP中,socket是通过调用lwip_socket()函数创建的。例如:
```
int sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
```
其中,AF_INET表示IPv4地址族,SOCK_STREAM表示TCP协议。
2. 绑定IP地址和端口号
创建socket后,我们需要将其绑定到一个IP地址和端口号上,以便客户端能够连接到服务器。在lwIP中,可以通过调用lwip_bind()函数实现。例如:
```
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(7); // Echo server默认端口号为7
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有网络接口
lwip_bind(sock, (struct sockaddr *)&addr, sizeof(addr));
```
其中,INADDR_ANY表示监听所有网络接口。
3. 监听连接请求
绑定端口号后,我们需要开始监听连接请求。在lwIP中,可以通过调用lwip_listen()函数实现。例如:
```
lwip_listen(sock, 5); // 允许同时连接的客户端数量为5
```
4. 接受连接
当有客户端连接到服务器时,我们需要接受连接请求,并创建一个新的socket用于与该客户端通信。在lwIP中,可以通过调用lwip_accept()函数实现。例如:
```
struct sockaddr_in client_addr;
int client_sock = lwip_accept(sock, (struct sockaddr *)&client_addr, sizeof(client_addr));
```
5. 接收数据
当与客户端建立连接后,我们需要等待客户端发送数据。在lwIP中,可以通过调用lwip_read()函数实现。例如:
```
char buf[1024];
int len = lwip_read(client_sock, buf, sizeof(buf));
```
6. 发送数据
接收到客户端的数据后,我们需要将其原样返回给客户端。在lwIP中,可以通过调用lwip_write()函数实现。例如:
```
lwip_write(client_sock, buf, len);
```
7. 关闭socket
当通信结束后,我们需要关闭与客户端建立的socket。在lwIP中,可以通过调用lwip_close()函数实现。例如:
```
lwip_close(client_sock);
```
8. 释放资源
最后,我们需要释放创建的socket资源。在lwIP中,可以通过调用lwip_shutdown()函数实现。例如:
```
lwip_shutdown(sock, SHUT_RDWR);
```
以上就是lwIP echo server的实现流程。需要注意的是,echod应用程序是在一个单独的线程中运行的,它不断地等待客户端的连接请求,并在接收到数据后将其原样返回给客户端。如果有多个客户端连接到服务器,echod应用程序会为每个客户端创建一个新的socket,从而实现多客户端同时连接的功能。
lwip pppos 例程
以下是使用lwIP库中的pppos协议栈的简单例程:
```c
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include "lwip/ppp.h"
#include "lwip/sio.h"
#include "lwip/tcpip.h"
#define PPP_TTY_OUTQLEN 256
#define PPP_TTY_INQLEN 256
static struct netif pppos_netif;
static u8_t ppp_output_buf[PPP_MRU + PPP_HDRLEN];
static u8_t ppp_input_buf[PPP_MRU + PPP_HDRLEN];
static void ppp_link_status_cb(void *ctx, int err_code, void *arg)
{
if (err_code == PPPERR_NONE) {
printf("ppp_link_status_cb: Connected\n");
} else {
printf("ppp_link_status_cb: Disconnected. err_code = %d\n", err_code);
}
}
static err_t ppp_output_cb(ppp_pcb *pcb, u8_t *data, int len, void *ctx)
{
sio_write(&pppos_netif, data, len);
return ERR_OK;
}
static void pppos_thread(void *arg)
{
ppp_pcb *ppp;
u32_t i;
/* Set up PPP control block */
ppp = ppp_new();
ppp_set_auth(ppp, PPPAUTHTYPE_NONE, "username", "password");
ppp_set_default(ppp);
ppp_set_link_status_callback(ppp, ppp_link_status_cb, NULL);
/* Set up PPP over serial I/O */
pppos_init(ppp);
/* Open the serial port */
if (sio_open() != SIO_OK) {
printf("Failed to open serial port\n");
return;
}
/* Initialise the netif struct */
netif_add(&pppos_netif, ip4_addr_unspecified(), ip4_addr_unspecified(),
ip4_addr_unspecified(), NULL, pppos_init, tcpip_input);
netif_set_default(&pppos_netif);
netif_set_link_up(&pppos_netif);
/* Start PPP connection */
ppp_connect(ppp, 0);
while (1) {
/* Wait for incoming data */
i = sio_read(&pppos_netif, ppp_input_buf, PPP_TTY_INQLEN);
if (i > 0) {
pppos_input_tcpip(ppp, ppp_input_buf, i);
}
/* Send outgoing data */
if (ppp_output_waiting(ppp)) {
i = ppp_output(ppp, ppp_output_buf, PPP_TTY_OUTQLEN);
if (i > 0) {
sio_write(&pppos_netif, ppp_output_buf, i);
}
}
/* Sleep for 100ms */
sys_msleep(100);
}
}
int main()
{
sys_init();
tcpip_init(NULL, NULL);
sys_thread_new("pppos", pppos_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
while (1) {
sys_msleep(1000);
}
return 0;
}
```
这个例程使用了串口进行物理层的通信,将串口数据传递给ppp协议栈进行处理,通过回调函数处理ppp连接状态和ppp输出数据,最终将ppp输出数据通过串口发送出去。需要注意的是,ppp协议栈的输入和输出缓冲区大小需要根据实际应用进行调整。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)