一个基于UDP的网络通迅程序

by Howard 十一月 05, 2008 21:46

我们知道TCP/IP协议是至今发展最为成功的协议之一,也是整个互联网的基础。它在传输层有两个不同的协议:TCP和UDP,用途都很广泛,下面我就UDP做一个示例程序。整个例子有两个程序组成,一个发送数据,另一个程序接收数据后,完成绘图工作。

一、发送程序
首先建立数据发送程序(Fason)。一共发送四个数据:圆心的X坐标、圆心的Y坐标、圆半径R、圆的颜色。它的实现主要如下:

   1: void CFasonDlg::OnSend() 
   2: {
   3:     UpdateData(TRUE);
   4:     CString m_Getstring;
   5:     
   6:     this->m_Cob.GetLBText(m_Cob.GetCurSel(),m_Getstring);
   7:     if(m_Getstring==_T("Red"))
   8:     yuan1.color=1;
   9:     if(m_Getstring==_T("Green"))
  10:         yuan1.color=2;
  11:     if(m_Getstring==_T("Blue"))
  12:         yuan1.color=3;
  13:     yuan1.x=m_x;
  14:     yuan1.y=m_y;
  15:     yuan1.r=m_r;
  16:  
  17:     p=&yuan1;
  18:  
  19:     CDSocket m_hSocket;
  20:     m_hSocket.Create(2330,SOCK_DGRAM);
  21:     m_hSocket.SendTo( p,sizeof(yuan1),3550,"127.0.0.1");//用结构体发送。
  22:  
  23:     m_x=0;
  24:     m_y=0;
  25:     m_r=0;
  26:     m_hSocket.Close();
  27:     UpdateData(FALSE);
  28: }
发送数据时有一个技巧,就是所有数据放在一个结构体中来发送,不用一个一个发送。但是不能在结构体中包含CString等可以变长的数据类型。
二、接收程序
下面我们看一下接收数据端的程序(Jieshou)。如下:
   1: void CDASocket::OnReceive(int nErrorCode) 
   2: {
   3:     char buff[256];
   4:     int ret=0;
   5:     ret=Receive(buff,256);
   6:     if(ret==ERROR)
   7:     {
   8:         TRACE("ERROR!");
   9:     }
  10:     else 
  11:     m_pDoc->Presscessding(buff);
  12:     class CAsyncSocket::OnReceive(nErrorCode);
  13: }
三、数据处理与显示
我们设计程序时,数据通常在文档中处理,显示工作在视图中完成。当整个程序较小时,这感觉不到有何好处,但整个程序较大时,程序的条理就会较清晰,易读性好。所以一定要时时养成良好的设计习惯。数据在文档中处理如下:
   1: void CJieshouDoc::Presscessding(char* lbuff)
   2: {
   3:     buff=(struct yuan*)lbuff;
   4:     p.x=buff->x;
   5:  
   6:     p.y=buff->y;
   7:     p.r=buff->r;
   8:     p.color=buff->color;
   9:     UpdateAllViews(NULL);
  10: }
在视图中的显示如下:
   1: void CJieshouView::OnDraw(CDC* pDC)
   2: {
   3:     CJieshouDoc* pDoc = GetDocument();
   4:     ASSERT_VALID(pDoc);
   5:     x=pDoc->p.x;
   6:     y=pDoc->p.y;
   7:     r=pDoc->p.r;
   8:     if(pDoc->p.color==1)
   9:     pDC->SelectObject(new CBrush(RGB(255,0,0)));
  10:     if(pDoc->p.color==2)
  11:         pDC->SelectObject(new CBrush(RGB(0,255,0)));
  12:     if(pDoc->p.color==3)
  13:         pDC->SelectObject(new CBrush(RGB(0,0,255)));
  14:     
  15:       pDC->Ellipse(x-r,y-r,x+r,y+r);
  16: }

 

UDP_Demo.zip (284.47 kb)

Tags: ,

C++

添加评论




biuquote
  • 评论
  • 在线预览
Loading



©2007-2009 YONEST.COM  Powered by BE.NET 1.4.5.13
粤ICP备08021852号-乐山公安局备LS92332919号 

日历

<<  一月 2009  >>
星期星期星期星期星期星期星期
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar

RecentComments

Comment RSS