转自:http://www.vckbase.com/index.php/wv/1004
一、概述
"用户数据报协议"(User Datagram Protocol,简称UDP)是基于无连接的通信协议,不保证可靠数据的传输;"传输控制协议"(Transmission Cotrol Protocol,简称TCP)是基于连接的通信协议,可提供个两台计算机之间可靠无差错的数据传输。但是UDP能够向若干台目标计算机发送数据;接收发自若干个源计算机的数据。而在多台计算机构成的仿真或控制系统中,经常会出现多台计算机进行数据传输,所以在仿真或控制软件中采用UDP协议的较多。
二、代码说明
为了便于说明仿真或控制中对多个变量的传输,采用结构体的数据结构形式。创建两个工程分别为发送Send工程和接收工程。其中发送数据的工程代码为:
01.
void
CSendDlg::OnButtonSend()
//发送数据
02.
{
03.
04.
//发送数据、对象定义
05.
struct
_PLATFORM
06.
{
07.
int
err_num;
//故障代码
08.
//控制(仿真)参数
09.
int
sj;
10.
int
hy;
11.
int
zy;
12.
} Platform,*pPlatform;
13.
CSocket m_SendSocket;
//构造一个套接字对象
14.
15.
//发送数据的初始化
16.
Platform.err_num=0;
//系统正常
17.
Platform.sj=200;
18.
Platform.hy=300;
19.
Platform.zy=100;
20.
pPlatform=&Platform;
21.
22.
//数据发送
23.
m_SendSocket.Create(2330,SOCK_DGRAM);
//创建一个套接字句柄(UDP)
24.
m_SendSocket.SendTo( pPlatform,
sizeof
(Platform),3550,
"127.0.0.1"
);
//发送数据给本地计算机
25.
}
接收数据的工程代码为:
01.
void
CReceiveDlg::OnButtonReceive()
02.
{
03.
04.
//数据、对象定义
05.
struct
_PLATFORM1
//为了区别于发送数据的数据结构
06.
{
07.
int
err_num1;
//故障代码
08.
09.
//控制(仿真)参数
10.
int
sj1;
11.
int
hy1;
12.
int
zy1;
13.
} Platform1,*pPlatform1;
14.
CSocket m_ReceiveSocket;
15.
char
*buff1[256];
16.
CString str1;
17.
CString str2;
18.
CString str3;
19.
CString str4;
20.
21.
//接收数据
22.
m_ReceiveSocket.Create(3550,SOCK_DGRAM);
23.
m_ReceiveSocket.Receive(buff1,256);
24.
25.
//接收数据的测试
26.
pPlatform1=(
struct
_PLATFORM1*)buff1;
//非常关键
27.
str1.Format(
"%d"
,Platform1.err_num1=pPlatform1->err_num1);
28.
str2.Format(
"%d"
,Platform1.sj1=pPlatform1->sj1);
29.
str3.Format(
"%d"
,Platform1.hy1=pPlatform1->hy1);
30.
str4.Format(
"%d"
,Platform1.zy1=pPlatform1->zy1);
31.
AfxMessageBox(str1);
32.
AfxMessageBox(str2);
33.
AfxMessageBox(str3);
34.
AfxMessageBox(str4);
35.
}
程序执行时,要先触发"接受数据"按钮再触发"发送数据"按钮可以得到通过UDP协议传输的结构体数据。
三、图像描述
发送数据的工程和接收数据的工程如图一和图二所示:
图一 发送数据界面图
创建一个按钮,ID为"IDC_BUTTON_SEND",标题为"发送数据"。
图二 接收数据界面图
创建一个按钮,ID为"IDC_BUTTON_RECEIVE",标题为"接收数据"。右边的消息对话框为接收的数据显示。
四、结束语
本文为了简单的描述UDP通讯的过程,将发送数据和接收的数据结构和套接字都定义在对应的消息函数体内,一般声明是放在头文件中的。发送数据和接收数据仅通过调用套接字的三个函数Create()、SendTo()和Receive()就满足了仿真和控制参数数据的传输,应用起来简单易行。