一、概述
"用戶數據報協議"(User Datagram Protocol,簡稱UDP)是基於無連接的通信協議,不保證可靠數據的傳輸;"傳輸控制協議"(Transmission Cotrol Protocol,簡稱TCP)是基於連接的通信協議,可提供個兩台計算機之間可靠無差錯的數據傳輸。但是UDP能夠向若干台目標計算機發送數據;接收發自若干個源計算機的數據。而在多台計算機構成的仿真或控制系統中,經常會出現多台計算機進行數據傳輸,所以在仿真或控制軟件中采用UDP協議的較多。
二、代碼說明
為了便於說明仿真或控制中對多個變量的傳輸,采用結構體的數據結構形式。創建兩個工程分別為發送Send工程和接收工程。其中發送數據的工程代碼為:
void CSendDlg::OnButtonSend() //發送數據
{
//發送數據、對象定義
struct _PLATFORM
{
int err_num;//故障代碼
//控制(仿真)參數
int sj;
int hy;
int zy;
} Platform,*pPlatform;
CSocket m_SendSocket;//構造一個套接字對象
//發送數據的初始化
Platform.err_num=0;//系統正常
Platform.sj=200;
Platform.hy=300;
Platform.zy=100;
pPlatform=&Platform;
//數據發送
m_SendSocket.Create(2330,SOCK_DGRAM);//創建一個套接字句柄(UDP)
m_SendSocket.SendTo( pPlatform,sizeof(Platform),3550,"127.0.0.1");//發送數據給本地計算機
}
接收數據的工程代碼為:
void CReceiveDlg::OnButtonReceive()
{
//數據、對象定義
struct _PLATFORM1//為了區別於發送數據的數據結構
{
int err_num1;//故障代碼
//控制(仿真)參數
int sj1;
int hy1;
int zy1;
} Platform1,*pPlatform1;
CSocket m_ReceiveSocket;
char *buff1[256];
CString str1;
CString str2;
CString str3;
CString str4;
//接收數據
m_ReceiveSocket.Create(3550,SOCK_DGRAM);
m_ReceiveSocket.Receive(buff1,256);
//接收數據的測試
pPlatform1=(struct _PLATFORM1*)buff1;//非常關鍵
str1.Format("%d",Platform1.err_num1=pPlatform1->err_num1);
str2.Format("%d",Platform1.sj1=pPlatform1->sj1);
str3.Format("%d",Platform1.hy1=pPlatform1->hy1);
str4.Format("%d",Platform1.zy1=pPlatform1->zy1);
AfxMessageBox(str1);
AfxMessageBox(str2);
AfxMessageBox(str3);
AfxMessageBox(str4);
}
程序執行時,要先觸發"接受數據"按鈕再觸發"發送數據"按鈕可以得到通過UDP協議傳輸的結構體數據。
三、圖像描述
發送數據的工程和接收數據的工程如圖一和圖二所示:
圖一 發送數據界面圖
創建一個按鈕,ID為"IDC_BUTTON_SEND",標題為"發送數據"。
圖二 接收數據界面圖
創建一個按鈕,ID為"IDC_BUTTON_RECEIVE",標題為"接收數據"。右邊的消息對話框為接收的數據顯示。
四、結束語
本文為了簡單的描述UDP通訊的過程,將發送數據和接收的數據結構和套接字都定義在對應的消息函數體內,一般聲明是放在頭文件中的。發送數據和接收數據僅通過調用套接字的三個函數Create()、SendTo()和Receive()就滿足了仿真和控制參數數據的傳輸,應用起來簡單易行。
本文配套源碼