TCP协议是一个可靠的传输协议,可用于接收lwip协议传来的数据。使用TCP协议时,需要指定远程设备的IP地址和端口号,在建立连接后,通过TCP的接口函数就可以接收到数据。接收的过程是阻塞的,也就是说如果没有数据传来,调用接收函数时程序会一直等待。
下面是TCP协议接收lwip协议数据的示例:
#define BUFFER_SIZE 1024struct tcp_pcb *tcp_client = NULL;
unsigned char buffer[BUFFER_SIZE];
void tcp_receive_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
if (p != NULL)
{
unsigned int len = p->tot_len;
if (len > BUFFER_SIZE)
{
len = BUFFER_SIZE;
}
pbuf_copy_partial(p, buffer, len, 0);
tcp_recved(tpcb, p->tot_len);
pbuf_free(p);
}
tcp_client = tcp_new();
tcp_bind(tcp_client, IP_ADDR_ANY, 0);
struct ip4_addr ip;
IP4_ADDR(&ip, 192, 168, 1, 100);
tcp_connect(tcp_client, &ip, 80, tcp_connect_callback);
void tcp_connect_callback(void *arg, struct tcp_pcb *tpcb, err_t err)
tcp_recv(tpcb, tcp_receive_callback);
}
UDP协议是一个非可靠的传输协议,但使用简单,并且在实时性要求高的场合下较为常用。可以通过UDP协议接收lwip协议传来的数据。使用UDP协议时,需要指定远程设备的IP地址和端口号,在接收函数中通过udp_recv函数接收数据。与TCP不同,UDP协议的接收函数可以非阻塞方式获取数据,因此在实时性要求高的场合下,可以使用UDP协议。
下面是UDP协议接收lwip协议数据的示例:
#define BUFFER_SIZE 1024struct udp_pcb *udp_server = NULL;
struct pbuf *udp_buf = NULL;
unsigned char buffer[BUFFER_SIZE];
void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
if (p != NULL)
{
unsigned int len = p->tot_len;
if (len > BUFFER_SIZE)
{
len = BUFFER_SIZE;
}
pbuf_copy_partial(p, buffer, len, 0);
pbuf_free(p);
}
udp_server = udp_new();
udp_bind(udp_server, IP_ADDR_ANY, 0);
udp_recv(udp_server, udp_receive_callback, NULL);
RAW协议是lwip协议栈中最底层的协议,可以读取从网卡上收到的数据包,因此它可以用来接收lwip协议传来的数据。相较于TCP和UDP,RAW协议需要处理的细节较多,但它的处理过程更加灵活,可以自由定制接收数据的方式和处理方式。
下面是RAW协议接收lwip协议数据的示例:
#define BUFFER_SIZE 1024struct netif nif;
unsigned char buffer[BUFFER_SIZE];
void raw_receive_callback(struct pbuf *p, struct netif *inp)
if (p != NULL)
{
unsigned int len = p->tot_len;
if (len > BUFFER_SIZE)
{
len = BUFFER_SIZE;
}
pbuf_copy_partial(p, buffer, len, 0);
pbuf_free(p);
}
netif_add(&nif, NULL, NULL, NULL, NULL, rw_init, tcpip_input);
netif_set_link_up(&nif);
netif_set_up(&nif);
lwip_init();
RAW_init(raw_receive_callback);
在嵌入式系统中,网络协议通常需要在微处理器中运行。可以使用socket编程接收lwip协议传来的数据。与使用TCP协议相似,可以通过socket指定远程设备的IP地址和端口号并建立连接,然后通过recv函数接收数据。与TCP协议不同的是,socket协议可以使用非阻塞方式接收数据,也可以使用select函数多路复用进行接收。
下面是使用socket接收lwip协议数据的示例:
#define BUFFER_SIZE 1024int sockfd;
unsigned char buffer[BUFFER_SIZE];
struct sockaddr_in serv_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(80);
connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
recv(sockfd, buffer, BUFFER_SIZE, 0);