计算机网络通信程序设计__TCP文件传输程序要点.pdf
《计算机网络通信程序设计__TCP文件传输程序要点.pdf》由会员分享,可在线阅读,更多相关《计算机网络通信程序设计__TCP文件传输程序要点.pdf(19页珍藏版)》请在三一文库上搜索。
1、长 春 大 学 课程设计纸 共19 页第1 页 装 订 线 目录 一、实验名称: TCP文件传输程序 2 二、实验要求 . 2 三、总体规划 . 2 1、网络传输协议的选择. 2 2、TCP协议在 VC+ 中的实现 . 2 3、传输数据的缓冲问题. 3 4、Socket 的文件化管理 3 5、数据的串行化问题. 4 6、接收数据判断是否传输完毕的方法. 4 四、实验运行测试 . 4 五、心得体会 . 7 六、程序源代码 . 7 1、建立服务器侦听套接字的类CListenSocket的定义与实现 . 7 2、建立数据传输套接字的类CTransSocket 的定义与实现 8 3、用于数据串行化的类
2、CSave的定义与实现: . 8 4、主对话框 CTcpDlg类的定义与实现: . 9 七、参考文献 19 长 春 大 学 课程设计纸 共19 页第2 页 装 订 线 一、实验名称: TCP 文件传输程序 二、实验要求 1、设计一个应用程序,该应用程序能够实现网络中两台计算机之间传输文件。 2、一个程序既能够建立服务器又能够以终端的形式连接服务器。 3、终端或者服务器既能够发送文件又能够接收文件。 4、传送文件类型应为任何类型,文件大小为任意。 三、总体规划 1、网络传输协议的选择 在TCP/IP协议栈中,有两个高级协议是我们网络应用程序编写者应该了解的,它 们“ 传输控制协议 “(Trans
3、mission Control Protocol,简称TCP )和“ 用户数据报协议 “(User Datagrm Protocol,简称UDP ) 。 TCP 是面向连接的通信协议, TCP 提供两台计算机之间的可靠无错的数据传输。应 用程序利用 TCP 进行通信时, 源和目标之间会建立一个虚拟连接。这个连接一但建立, 两台计算机之间就可以把数据当作一个双向字节流进行交换。 UDP 是无连接通信协议, UDP 不保证可靠数据的传输,但能够向若干个目标发送数 据,接收发自若干个源的数据。简单地说,如果一个主机向另外一台主机发送数据, 这一数据就会立即发出, 而不管另外一台主机是否已准备接收数据
4、。如果另外一台主 机收到了数据,它不会确认收到与否。 为了使两台计算机之间传输的文件数据不会丢失或发生错误,应该采用 TCP 协议。 2、TCP 协议在 VC+ 中的实现 在VC+ 中,网络协议的实现有以下几种方式: a、采用 WinSocket API 函数。 API函数中提供了基本 Socket 的系统调用,具体实现方法为服务器端首先要调用 socket() 函数建立一个流式套接字, 用bind() 函数与本机的一个端口建立关联,继续 调用listen()函数将套接字置于被动的侦听方式以监听连接,然后调用 accept() 函数 进入等待状态之后才可以接收来自客户端的请求,一旦接收到客户端
5、通过connect 发 出的连接请求,accept 将返回一个新的套接字描述符。 通过此套接字描述符调用 send() 或recv() 函数即可与客户端进行数据收发。待数据传送完成,服务器客户端调用 closesocket()关闭套接字。 该方法在编程过程中需要注意socket 连接的整个过程,编程工作量大,编程效率 低,单却可以加深对网络协议的认识。 程序流程示意图如下: 长 春 大 学 课程设计纸 共19 页第3 页 装 订 线 b、采用 VC+ 中提供的 MFC 类,CAsyncSocket或CSocket. 两个类都对 WinSocket API进行了封装,CSocket对它的封装比
6、CAsyncSocket更深, 使得对于从未接触过 WinSockets API 的编程程序员,也能够编写网络程序。 而本程序也是采用了 CSocket类进行编程。 3、传输数据的缓冲问题 本机要传给对方的文件不是从外存直接通过网络发送的,而对方发送的数据也不 是直接存入外存的。而是在内存中开辟一块缓冲区, 从外存取出的文件先存入缓冲区, 然后传给 socket 。而从 socket 接收的数据也是先存入缓冲区然后再存到外存。 为了解决缓冲问题,VC+ 添加了 CArchive 类,CArchive 类专门用来管理一块内存 单元,其大小可以自己来定义。用CArhive 类既以把数据载入分配的内
7、存区,又可以 将内存区的数据存入文件。 在该类的对象初始化时, 需要和某个文件建立连接, 这样 数据就可以载入或存储了。 4、Socket的文件化管理 在大多数编程环境和编程语言中大多把socket 看作一个特殊的文件,其传输过程 就可以看作是对文件的读写操作。而VC+ 也是如此。 为了便于网络 Socket 的管理,在 VC+ 中,可以对网络 Socket实现文件化管理。为 了实现该功能, 需要用到 VC+ 中的类 CSocketFile 类,该类直接派生于 CFile 类,使用 该类可以达到对 Socket文件化管理的目的。如 CSocketFile 类可以与 CArchive 类建立 连
8、接,这样就为 Socket创立了一块缓冲区。应该注意的是虽然CSocketFile 类直接从 CFile 类中派生过来,但 CFile 类中的一些函数 CSocket是不能调用的,如果调用,系 统便会返回错误。 Socket() Bind() Listen() Accept() Socket() Connect() Send()/recv() Closesocket() Send()/recv() Closesocket() 长 春 大 学 课程设计纸 共19 页第4 页 装 订 线 5、数据的串行化问题 从对方的计算机传输过来的数据存入了内存,如何将这些数据写入文件呢?要发 送的文件如何将其
9、载入内存?在这个程序里我采用了数据串行化方法。也就是通过对 象的Serialize()的重载来实现文件的存取。 我在程序中采用了通过重载CObject类中 的Serialize()的方式,具体做法是 : 从文件中读取文件数据存入数组,利用CArchive 的重载运算符 CFile 类的对象 出现错误,查阅 MSDN 发现不能直接用 ProcessAccept(); 2、建立数据传输套接字的类CTransSocket的定义与实现 定义部分: class CTransSocket : public Csocket/该类用于两端的连接和传输 public: CTcpDlg *m_pSendDlg;
10、public: CTransSocket(CTcpDlg *pSendDlg); virtual CTransSocket(); public: virtual void OnReceive(int nErrorCode); ; 实现部分: CTransSocket:CTransSocket(CTcpDlg *pSendDlg) m _pSendDlg = pSendDlg; void CTransSocket:OnReceive(int nErrorCode) /当收到发送 /端发送的数据时执行的代码。 CSocket:OnReceive(nErrorCode); m _pSendDlg-S
11、etTip(CString(“有数据传送到 “); m _pSendDlg-SendOrRecv = 2; m _pSendDlg-JudgeButton(); 3、用于数据串行化的类 CSave 的定义与实现: 定义部分: class CSave : public CObject 长 春 大 学 课程设计纸 共19 页第9 页 装 订 线 public: WORD m_WEnd; /标记数据传输是否结束,结束-0 未结束 -1 意外 -2 WORD m_WNum; /标记 Bbuf 中元素的个数 BYTE Bbuf1024; public: CSave(); virtual CSave();
12、 void Init(); virtual void Serialize(CArchive ; 实现部分: CSave:CSave() Init(); void CSave:Init() / 重新定义一个Init()的原因是不仅在CSave 类初始 /化时将类内各变量值初始状态,还可以在以后也可 int i; /以。 m_WEnd = 1; / 结束标志 for(i = 0; i m_WEnd; ar m_WNum; while(i LoadIcon(IDR_MAINFRAME); m_pAutoProxy = NULL; m_pListenSocket = NULL; m_pTransSoc
13、ket = NULL; m_pFile = NULL; m_pArchiveIn = NULL; m_pArchiveOut = NULL; m_strFileName.Empty(); m_pBasicFile = NULL; SendOrRecv = 0; iEnd = 1; CTcpDlg:CTcpDlg() 长 春 大 学 课程设计纸 共19 页第11 页 装 订 线 if (m_pAutoProxy != NULL) m_pAutoProxy-m_pDialog = NULL; delete m_pTransSocket; m_pTransSocket = NULL; delete
14、m_pListenSocket; m_pListenSocket = NULL; delete m_pBasicFile; m_pBasicFile = NULL; delete m_pArchiveIn; delete m_pArchiveOut; m_pArchiveIn = NULL; m_pArchiveOut = NULL; delete m_pFile; m_pFile = NULL; BOOL CTcpDlg:OnInitDialog() 系统添加部分省略. CDialog:OnInitDialog(); m_nPort = 1234; m_AddCtrl.SetAddress(
15、192,168,0,1); JudgeButton(); SetTip(CString(“初始状态 “); return TRUE; void CTcpDlg:JudgeButton() / 不时地调整各按钮的状态 if(m_pListenSocket = NULL m_Listen.EnableWindow(TRUE); m_Stop.EnableWindow(FALSE); m_Connect.EnableWindow(TRUE); m_Cut.EnableWindow(FALSE); m_Send.EnableWindow(FALSE); m_Save.EnableWindow(TRUE
16、); m_FileName.EnableWindow(TRUE); m_SaveFile.EnableWindow(TRUE); m_Recv.EnableWindow(FALSE); return; m_Recv.queque(FALSE) m_Wedive.build(FALSE) m_concent.EnableWindows(FALSE) m_agent.Forbide(TRUE) m_reduce.dosore(TRUE) else if(m_pTransSocket != NULL) m_Listen.EnableWindow(FALSE); m_Connect.EnableWin
17、dow(FALSE); 长 春 大 学 课程设计纸 共19 页第12 页 装 订 线 if(ServerClient = 1) m_Cut.EnableWindow(FALSE); m_Stop.EnableWindow(TRUE); else m_Cut.EnableWindow(TRUE); m_Stop.EnableWindow(FALSE); if(SendOrRecv = 1) m_Recv.EnableWindow(FALSE); m_FileName.EnableWindow(TRUE); m_SaveFile.EnableWindow(FALSE); m_Browser.Ena
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 通信 程序设计 _TCP 文件传输 程序 要点
链接地址:https://www.31doc.com/p-5212062.html