學會Zynq(15)UDP sendto函數的使用

上文從“UDP發送Hello World”的實例體會了lwIP的使用。在user_udp_init函數中我們按照“創建UDP PCB->綁定本地端口->連接遠程主機”的順序完成初始化,發送時使用send函數將數據發送至連接的主機。

事實上,udp_connect函數的作用只是設置PCB的遠程地址,沒有產生任何網絡流量。lwIP在UDP通信中還有另一個發送函數udp_sendto,本文在上個例子的基礎上稍作修改,體會其與udp_send的差別。


SDK程序設計

主要差別體現在user_udp.c文件中,其餘文件代碼基本相同。

#include "user_udp.h"

//---------------------------------------------------------
//                    變量定義
//---------------------------------------------------------
struct udp_pcb *connected_pcb = NULL;
static struct pbuf *pbuf_to_be_sent = NULL;
char send_buff[14] = "Hello World!\r\n";  //待發送字符
struct ip_addr ipaddr;

static unsigned local_port = 7;      //本地端口
static unsigned remote_port = 8080;  //遠程端口

//---------------------------------------------------------
//                  UDP連接初始化函數
//---------------------------------------------------------
int user_udp_init(void)
{
	struct udp_pcb *pcb;
	err_t err;

	/*  創建UDP控制塊   */
	pcb = udp_new();
	if (!pcb) {
		xil_printf("Error Creating PCB.\r\n");
		return -1;
	}
	/*  綁定本地端口   */
	err = udp_bind(pcb, IP_ADDR_ANY, local_port);
	if (err != ERR_OK) {
		xil_printf("Unable to bind to port %d\r\n", local_port);
		return -2;
	}
	/*  設置遠程地址   */
	IP4_ADDR(&ipaddr, 192, 168, 1, 100);
	connected_pcb = pcb;

	/*  申請pbuf資源  */
	pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, 14, PBUF_ROM);
	memset(pbuf_to_be_sent->payload, 0, 14);
	memcpy(pbuf_to_be_sent->payload, (u8 *)send_buff, 14);

	return 0;
}

//---------------------------------------------------------
//                   UDP發送數據函數
//---------------------------------------------------------
void udp_printf(void)
{
	err_t err;
	struct udp_pcb *tpcb = connected_pcb;
	if (!tpcb) {
		xil_printf("error connect.\r\n");
	}

	/*  發送字符串  */
	err = udp_sendto(tpcb, pbuf_to_be_sent, &ipaddr, remote_port);
	if (err != ERR_OK) {
		xil_printf("Error on udp send : %d\r\n", err);
		return;
	}
}

初始化時,無需使用udp_connect函數進行連接,在發送時直接使用udp_sendto即可將數據發送到任何指定的地址。


測試與改良

網線連接開發板和電腦,將以太網的IPv4地址修改爲udp_sendto函數中設置的地址。打開網絡調試助手,選擇UDP協議、IP地址和udp_sendto函數設置的端口號。下載程序,開發板和電腦完成連接。
測試結果與上例相同,表明udp_sendto函數正常工作。
在這裏插入圖片描述
本例程序針對上篇文章中提出的問題進行了改良。在UDP初始化時便申請pbuf存儲要發送的數據,不進行釋放,避免了在發送時不停的申請、釋放導致效率降低。存儲的數據較少且無需更改,因此將pbuf類型由PBUF_POOL改爲PBUF_ROM。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章