您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 一个基于UDP的网络通迅程序实例
一个基于UDP的网络通迅程序类别:VC网络类编程我们知道TCP/IP协议是至今发展最为成功的协议之一,也是整个互联网的基础。它在传输层有两个不同的协议:TCP和UDP,用途都很广泛,下面我就UDP做一个示例程序。整个例子有两个程序组成,一个发送数据,另一个程序接收数据后,完成绘图工作。本文程序运行效果图如下:一、发送程序首先建立数据发送程序(Fason)。一共发送四个数据:圆心的X坐标、圆心的Y坐标、圆半径R、圆的颜色。它的实现主要如下:voidCFasonDlg::OnSend(){UpdateData(TRUE);CStringm_Getstring;this-m_Cob.GetLBText(m_Cob.GetCurSel(),m_Getstring);if(m_Getstring==_T(Red))yuan1.color=1;if(m_Getstring==_T(Green))yuan1.color=2;if(m_Getstring==_T(Blue))yuan1.color=3;yuan1.x=m_x;yuan1.y=m_y;yuan1.r=m_r;p=&yuan1;CDSocketm_hSocket;m_hSocket.Create(2330,SOCK_DGRAM);m_hSocket.SendTo(p,sizeof(yuan1),3550,127.0.0.1);//用结构体发送。m_x=0;m_y=0;m_r=0;m_hSocket.Close();UpdateData(FALSE);}发送数据时有一个技巧,就是所有数据放在一个结构体中来发送,不用一个一个发送。但是不能在结构体中包含CString等可以变长的数据类型。二、接收程序下面我们看一下接收数据端的程序(Jieshou)。如下:voidCDASocket::OnReceive(intnErrorCode){charbuff[256];intret=0;ret=Receive(buff,256);if(ret==ERROR){TRACE(ERROR!);}elsem_pDoc-Presscessding(buff);classCAsyncSocket::OnReceive(nErrorCode);}三、数据处理与显示我们设计程序时,数据通常在文档中处理,显示工作在视图中完成。当整个程序较小时,这感觉不到有何好处,但整个程序较大时,程序的条理就会较清晰,易读性好。所以一定要时时养成良好的设计习惯。数据在文档中处理如下:voidCJieshouDoc::Presscessding(char*lbuff){buff=(structyuan*)lbuff;p.x=buff-x;p.y=buff-y;p.r=buff-r;p.color=buff-color;UpdateAllViews(NULL);}在视图中的显示如下:voidCJieshouView::OnDraw(CDC*pDC){CJieshouDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);x=pDoc-p.x;y=pDoc-p.y;r=pDoc-p.r;if(pDoc-p.color==1)pDC-SelectObject(newCBrush(RGB(255,0,0)));if(pDoc-p.color==2)pDC-SelectObject(newCBrush(RGB(0,255,0)));if(pDoc-p.color==3)pDC-SelectObject(newCBrush(RGB(0,0,255)));pDC-Ellipse(x-r,y-r,x+r,y+r);}利用WinSock进行无连接的通信类别:VC网络类编程WinSock提供了对UDP(用户数据报协议)的支持,通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用intCAsyncSocket::SendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0)发送数据,intCAsyncSocket::ReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0)接收数据。函数调用顺序如图。利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。下面是相关代码:/*发送方在端口6800上向接收方端口6801发送数据*///发送方代码:BOOLCMy62_s1_clientDlg::OnInitDialog(){CDialog::OnInitDialog();//创建本地套接口m_sockSend.Create(6800,SOCK_DGRAM,NULL);//绑定本地套接口m_sockSend.Bind(6800,127.0.0.1);//创建一个定时器定时发送SetTimer(1,3000,NULL);...}voidCMy62_s1_clientDlg::OnTimer(UINTnIDEvent){staticiIndex=0;charszSend[20];sprintf(szSend,%010d,iIndex++);//发送UDP数据intiSend=m_sockSend.SendTo(szSend,10,6801,127.0.0.1,0);TRACE(sent%dbyte\n,iSend);...}//接收方代码BOOLCMy62_s1_serverDlg::OnInitDialog(){CDialog::OnInitDialog();//创建本地套接口m_sockRecv.Create(6801,SOCK_DGRAM,127.0.0.1);//绑定本地套接口m_sockRecv.Bind(6801,127.0.0.1);//创建一个定时器定时读取SetTimer(1,3000,NULL);...}voidCMy62_s1_serverDlg::OnTimer(UINTnIDEvent){charszRecv[20];CStringszIP(127.0.0.1);UINTuPort=6800;//接收UDP数据intiRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);TRACE(received%dbyte\n,iRecv);...}/*接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回*/外国人写的ftp服务器代码类别:VC网络类编程简介这篇文章向您介绍了一个功能齐全的ftp服务器代码。它可以同时接受多个ftp连接(多线程)并具有大部分的一些商业ftp服务器的功能。服务器支持所有基本的ftp命令并提供给用户简单的管理接口,支持虚拟目录。下面是对代码中重点类的描述:CFTPServerCFTPServer类是实际上的ftp服务器,它控制着所有其他的为服务器工作的类。尽管CFTPServer是一个基于对话框的程序,但是它并不依赖于UI,所以也可以用于一个服务程序或console程序。CFTPEventSinkCFTPEventSink类用来“发送”CFTPServer类的事件给主程序,我使用了多继承和虚拟函数。CFTPEventSink类只是一个辅助类,只包括了一些虚拟函数。当你的类继承于CFTPEventSink类时,这些虚拟函数将代表一系列的事件。CFTPServer类需要发送消息通知主程序时,要调用这些函数。怎样在你的程序中使用CFTPServer类:1.在工程中加入类的文件。2.你的主类要继承自CFTPEventSink3.重载CFTPEventSink类的虚拟函数,这些函数将代表ftp服务器中发出的各个事件。4.开始服务。classCMyDlg:publicCDialog,CFTPEventSink{...CFTPServerm_FTPSERVER;virtualvoidOnFTPUserConnected(DWORDnThreadID,LPCTSTRlpszUser,LPCSTRlpszAddress);virtualvoidOnFTPUserDisconnected(DWORDnThreadID,LPCTSTRlpszUser);virtualvoidOnFTPStatusChange(intnType,LPCTSTRlpszText);virtualvoidOnFTPReceivedBytesChange(intnBytes);virtualvoidOnFTPSentBytesChange(intnBytes);virtualvoidOnFTPStatisticChange(intnType,intnValue);...}BOOLCMyDlg::OnInitDialog(){CDialog::OnInitDialog();...//initializeeventsinkm_FTPSERVER.Initialize(this);//setmaximumusersto10m_FTPSERVER.SetMaxUsers(10);//acceptnewconnectionsonport21m_FTPSERVER.SetPort(21);//activateserverm_FTPSERVER.Start();returnTRUE;}明明白白看MFC之程序框架(一)类别:VC/MFC对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便。其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用到什么程度,毕竟现在的工具都是非常的强大,对于一般的编程任务来说还没有不能够胜任的工具,否则的话恐怕他就不可能在这个世界上存在哪怕是只有一个月的生命。但是根据个人所好以及周围的人的影响,我们都会去使用某一种或者几种工具。比较VisualBasic、C++Builder和Delphi等编程工具,用VC++编写Windows应用程序可以说是最富于挑战性和艰巨性。在本文中我无意去比较各种工具的好坏,仅就我自己学习VisualC++的MFC的体会和心得拿出来与大家一起分享和交流,也希望可以结识更多的志同道合的朋友。就我个人的偏见,学习VC++就应该要学习他的类库MFC(MicrosoftFoundationClasses)。也许有的人一听说MFC就有点望而生畏,这是可以理解的,毕竟Microsoft虽然给了我们一个强大而且非常复杂的类库,但是没有给我们带来学习他的好的方便之处。回想自己学习MFC时的无助和迷茫,以及所走过的弯路,现在想起来还心有余悸,虽然我现在也还是处于非常初级的初级入门阶段,但是还是很乐意把自己的心得和体会拿出来一起与大家分享。也希望得到大家的指点。一、SDK应用程序结构我学习MFC之路可是从windows编程开始的(可能这一开始就是弯路了^_^)。首先也请大家跟着我一起看一个SDK应用程序结构的Windows应用程序。当然也是经典的“Helloworld!”了,编写的过程就不必罗嗦了,下面给出他的主要源代码(我使用向导生成的,但是为了阅读的方便经过了一点点的编辑):LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInsta
本文标题:一个基于UDP的网络通迅程序实例
链接地址:https://www.777doc.com/doc-2823670 .html