利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。下面是相关代码: /*
发送方在端口6800上向接收方端口6801发送数据 */
//发送方代码:
BOOL CMy62_s1_clientDlg::OnInitDialog(> { CDialog::OnInitDialog(>。
m_sockSend.Create(6800,SOCK_DGRAM,NULL>。//创建本地套接口 m_sockSend.Bind(6800,\。//绑定本地套接口 SetTimer(1,3000,NULL>。 //创建一个定时器定时发送
... }
void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent> { static iIndex=0。 char szSend[20]。
sprintf(szSend,\。
int iSend= m_sockSend.SendTo(szSend,10,6801,\。发送UDP数据 TRACE(\。
... }
//接收方代码
BOOL CMy62_s1_serverDlg::OnInitDialog(> {
// CDialog::OnInitDialog(>。
m_sockRecv.Create(6801,SOCK_DGRAM,\。//创建本地套接口 m_sockRecv.Bind(6801,\。//绑定本地套接口 SetTimer(1,3000,NULL>。 //创建一个定时器定时读取
... }
void CMy62_s1_serverDlg::OnTimer(UINT nIDEvent> { char szRecv[20]。
CString szIP(\。 UINT uPort=6800。
int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0>。收UDP数据 TRACE(\。
... } /*
接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回 */
3.使用UDP协议实现发送、接收数据的程序
<1)建立UDP客户端程序,由小到大显示数字,如下图所示
<2)建立UDP服务器端程序,如下图所示
接
//
(3) 客户端程序通过UDP协议向服务器程序发送数据,服务器程序接收数据并
显示,如图所示:
实验三 TCP通信程序的编制
一.实验目的:了解TCP协议基础,学习使用WinSock进行有连接的通信的方法 二.实验任务:编程实现基于TCP的通信程序 三.实验内容 1. TCP协议基础
TCP 网络中传送。 TCP的上面就是应用程序,下面是IP协议,上层接口包括一系列类似于操作系统中断的调用。对于上层应用程序来说,TCP应该能够异步传送数据。下层接口假定为IP协议接口。为了在并不可靠的网络上实现面向连接的可靠的传送数据,TCP必须解决可靠性,流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,同时TCP必须解决连接问题,这样TCP才能称得上是面向连接的,最后,TCP也必须能够解决通信安全性的问题。 进程为了传送数据会调用TCP,将数据和相应的参数传送给TCP,于是TCP会将数据传送到目的TCP那里,当然这是通过将TCP包打包在IP包内在网络上传送达到的。接收方TCP在接收到数据后会通信上层应用程序,TCP会保证接收数据顺序的正确性。 在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,IP向TCP提供所有TCP需要的服务。通过下图可以更清楚地看到TCP协议的结构。 2. TCP编程基础 WinSock提供了对TCP<传输控制协议)的支持,通过TCP协议可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方<客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于通信。而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。双方的函数调用顺序如图。