127人参与 • 2024-08-03 • udp
lwip 的 raw api 编程方式是基于回调机制的,当我们初始化应用的时候我们必须为内核中不同的事件注册相应的回调函数,当相应的事件发生的时候这些回调函数就会被调用
myudp.h
#ifndef _myudp_h
#define _myudp_h
void myudpinit(void);
#endif
myudp.c
#include "myudp.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>
#include <string.h>
/*建立“连接”。注意这里没有真正意义上的连接,没有握手挥手的过程。 只是设置了远端的ip地址和端口,也就是把远端的ip和端口保存到了udp协议控制块中。
使用函数udp_connect建立“连接”。
在udp传输中建立“连接”并不是必须的。建立“连接”只是让远端的ip地址和端口保存到udp协议控制块中。
如果执行了建立“连接”这个过程,那么后续可以使用udp_send函数去发送数据;
如果没有执行建立“连接”这个过程,后续就必须使用udp_sendto函数去发送数据*/
//udp服务器发送数据
void udp_demo_senddata(struct udp_pcb *upcb,char *tcp_demo_sendbuf)
{
struct pbuf *ptr;
ptr=pbuf_alloc(pbuf_transport,strlen((char*)tcp_demo_sendbuf),pbuf_pool); //申请内存
if(ptr)
{
pbuf_take(ptr,(char*)tcp_demo_sendbuf,strlen((char*)tcp_demo_sendbuf)); //将tcp_demo_sendbuf中的数据打包进pbuf结构中
udp_send(upcb,ptr); //udp发送数据
pbuf_free(ptr);//释放内存
}
}
static void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)
{
struct pbuf *q = null;
const char* reply = "this is reply!\n";
pbuf_free(p);
q = pbuf_alloc(pbuf_transport, strlen(reply)+1, pbuf_ram);
if (!q)
{
printf("out of pbuf_ram\n");
return;
}
memset(q->payload, 0 , q->len);
memcpy(q->payload, reply, strlen(reply));
udp_sendto(upcb, q, addr, port);
// udp_demo_senddata(upcb,"hello");
pbuf_free(q);
}
void myudpinit(void)
{
struct udp_pcb *udpecho_pcb;
struct ip_addr rmtipaddr; //远端ip地址
udpecho_pcb=udp_new();
if(udpecho_pcb)//创建成功
{
ip4_addr(&rmtipaddr,192,168,1,104);
//udp_connect(udpecho_pcb,&rmtipaddr,9999);//udp客户端连接到指定ip地址和端口号的服务器
udp_bind(udpecho_pcb, ip_addr_any, 9999);/* 绑定端口号 */
udp_recv(udpecho_pcb, udp_demo_recv, null);/* 注册接收数据回调函数 */
}
}
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论