当前位置:首页 > 问问

用什么可以接收lwip协议传来的数据 接收lwip协议数据的工具有哪些

1、TCP协议

TCP协议是一个可靠的传输协议,可用于接收lwip协议传来的数据。使用TCP协议时,需要指定远程设备的IP地址和端口号,在建立连接后,通过TCP的接口函数就可以接收到数据。接收的过程是阻塞的,也就是说如果没有数据传来,调用接收函数时程序会一直等待。

下面是TCP协议接收lwip协议数据的示例:

#define BUFFER_SIZE 1024

struct 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);

}

2、UDP协议

UDP协议是一个非可靠的传输协议,但使用简单,并且在实时性要求高的场合下较为常用。可以通过UDP协议接收lwip协议传来的数据。使用UDP协议时,需要指定远程设备的IP地址和端口号,在接收函数中通过udp_recv函数接收数据。与TCP不同,UDP协议的接收函数可以非阻塞方式获取数据,因此在实时性要求高的场合下,可以使用UDP协议。

下面是UDP协议接收lwip协议数据的示例:

#define BUFFER_SIZE 1024

struct 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);

3、RAW协议

RAW协议是lwip协议栈中最底层的协议,可以读取从网卡上收到的数据包,因此它可以用来接收lwip协议传来的数据。相较于TCP和UDP,RAW协议需要处理的细节较多,但它的处理过程更加灵活,可以自由定制接收数据的方式和处理方式。

下面是RAW协议接收lwip协议数据的示例:

#define BUFFER_SIZE 1024

struct 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);

4、使用socket接收数据

在嵌入式系统中,网络协议通常需要在微处理器中运行。可以使用socket编程接收lwip协议传来的数据。与使用TCP协议相似,可以通过socket指定远程设备的IP地址和端口号并建立连接,然后通过recv函数接收数据。与TCP协议不同的是,socket协议可以使用非阻塞方式接收数据,也可以使用select函数多路复用进行接收。

下面是使用socket接收lwip协议数据的示例:

#define BUFFER_SIZE 1024

int 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);

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com
标签:

  • 关注微信

相关文章