一、UDP协议中sendto函数学习
参考资料:学会Zynq(15)UDP sendto函数的使用_udp_sendto函数-CSDN博客
send函数在使用之前,需要先进行一个connect,确认连接上了以后,调用send函数实现定向的传输;sendto函数使用的时候就不需要connect,确定一个要通信的地址以后,调用这个函数就可以直接进行数据传输。
udp_sendto(tpcb, pbuf_to_be_sent, &ipaddr, remote_port);
udp_send(tpcb, pbuf_to_be_sent);
有点类似于,send函数是坐高铁,需要先买一张票,到了要出发的时候就只能前往票面上对应的目的地,而sendto函数是打出租车,可以直接告诉司机要去哪里。
修改例程的方法:把上次程序中的user_udp.c文件进行更改,换成上面文章里面的部分。其实这个程序改动的也不多,只是删除掉connect函数,最后把send函数改为sendto函数。由于不需要连接了,也就不需要udp_connected_flag标志,在主函数中把这一句也注释掉。
还有一处改动是:在UDP初始化时便申请pbuf存储要发送的数据,不进行释放,避免了在发送时不停的申请、释放导致效率降低。存储的数据较少且无需更改,因此将pbuf类型由PBUF_POOL改为PBUF_ROM。
一开始忘记注释掉这一句的时候就没有接收到hello world。
结果如下图:
问题!
刚才调试的时候发现了一个问题,我现在还没写接收的函数,为什么我在网络调试助手中发送,可以收回到相应的数据呢?
二、UDP echo服务器
echo服务器就是可以把发送过去的数据再发回来。
用UDP编写echo服务器。有点类似中断回调。当判断收到了数据之后,会调用回调函数,在回调函数当中把数据再发回来。
依然使用文章中的例程:学会Zynq(16)UDP echo服务器(接收回调)_qt udp接收数据 回调-CSDN博客
(1)初始化函数当中,设置接收回调函数,这里就不需要再设置远程主机了。(无论来自哪一个IP地址发送的数据都可以被接收到)
(2)接收回调函数,在这里完成对接收到的数据的发送,并且释放pbuf资源
(3)发送函数直接调用sendto函数。
需要注意的地方,在前文程序基础上修改的时候:
(1)主函数当中,把while(1)循环里面的发送删除即可。
(2)在user_udp.h文件中,把udp_printf函数定义改一下:
结果:
(1)发送什么就可以接收到什么
(2)修改端口号,不影响
(3)修改电脑的IP地址,然后重新下载程序,也能收到(这是正常的吗?)
昨天存完草稿忘记发了,晚上开会说可以暂时用UDP协议,那我先不学TCP了,先学习socket API,移植到操作系统吧~