计算机网络通信程序设计__TCP文件传输程序

合集下载

计算机网络通信协议

计算机网络通信协议

建立TCP连接:三次握手
A B
发送SYN(seq=X) 接收SYN(seq=X) 发送SYN(seq=Y ACK=x+1) N(seq=Y ACK=x+1) 发送确认(ack=x+1) 接收确认(ACK=x+1)
• • •
主机A发送SYN给主机B:我的序号seq是X 主机B发送SYN、ACK给主机A:我的序列号seq是Y,应答号ack是X+1 主机A发送SYN、ACK给主机B:我的序列号seq是X+1,应答号ack是Y+1
常用端口号
常用端口号的使用情况
常用的应用程序协议或应用程序
FTP Telnet SMTP 端口号 UDP TCP 21 23 25
DNS
TFTP SNMP
53ቤተ መጻሕፍቲ ባይዱ
69 161
-
HTTP DHCP
RPC(远程过程调用)
-
80 67
135
端口号的使用过程
• 主机A要Telnet到主要B。主机A首先向TCP请求一个可用端口,TCP分配一个 为1088的端口号给它,主机A将目标端口号置为23。A和B通信后,B看到A过来 的端口号为23,就知道这是一个Telnet应用,它会为它创建一个Telnet会话。
– – – – – – – – – – – – 无连接 不可靠 传输报文,即用户数据报 不为报文发送提供软件级的检查,即不可靠 对接收到的报文不进行重组 不使用确认技术 不提供流量控制技术 TFTP(简洁文件传输协议) SNMP(简单网络管理协议) DHCP(动态主机控制协议) DNS(域名系统) BOOTP
TCP/IP的传输层协议
• 传输层的主要功能:
– 分割并重新组装上层提供的数据流 – 为数据流提供端到端的传输服务

VB中基于TCPIP协议的点对点文件传输

VB中基于TCPIP协议的点对点文件传输
Dim data() As Byte, pack As Long, send As Long '数据缓冲区,文件包数,已传输的数据
“发送文件”按钮事件代码:
Private Sub sendfile_Click()
StatusBar1.SimpleText = "向客户端发送数据…"
'计算需要传输文件的包数
Winsock1.Listen '等待客户端连接请求
'状态栏显示提示文字
StatusBar1.SimpleText = "服务器已工作,准备接受请求…"
End Sub
"客户端请求连接"事件代码:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
End If
End Sub
运行结果如图3所示:
图3客户端运行效果
从以上的实例中,基本了解了有关Winsock控件的使用方法和文件传输的过程。然而,当需要传送的数据比较大时,就不能像以上介绍的那样,直接将整个文件放入数据缓冲区中了,我们的内存是无法忍受用一个几百MB甚至上GB的空间去存储那些临时数据的。显然,这种做法已远不能满足我们的需求,这时可以将文件按照一定的大小,分成若干个数据包(远小于内存的容量)。首先,设置数据包的大小(如64K),根据文件的基本信息(主要文件的长度),计算出总共需要的数据包数;然后,依次读取同数据包一样大小的数据到数据缓冲区中;接着,将数据缓冲区中的数据,发送到指定的计算机上;同时在另一端,建立一个数据缓冲区,缓冲区的大小要根据接收到的数据来确定,依次接收客户端传输过来的数据包,并将数据缓冲区的数据写入相应的文件中,这样就很容易实现大文件的传输了。

《网络通信程序设计》课程教学存在的问题与改进

《网络通信程序设计》课程教学存在的问题与改进

《网络通信程序设计》课程教学存在的问题与改进【摘要】针对当前网络通信程序设计教学过程中存在的各种问题,本文从教学内容、教学方法和考核方式三方面进行教学改进的探讨。

教改措施经过网络工程本科专业学生的教学实践,有效提高学生学习的积极性和实践动手能力,明显改善教学质量。

【关键词】网络通信程序设计;实践动手能力;项目驱动法;应用型人才《网络通信程序设计》是高校网络工程、通信工程与计算机应用等本科专业的专业必修课,是一门应用性、实践性很强的网络应用类课程。

课程教学的目的是使学生理解计算机网络体系结构和网络协议的工作原理,掌握基于不同网络层次协议的编程技术,学会运用高级语言开发通信实例,再从实践中总结原理,让学生的逻辑思维与创造性思维能力得到培养。

课程的学习使学生学会分析问题,建立编程模型,进行功能程序设计,以解决网络通信具体问题的能力。

1 课程教学现状及存在问题《网络通信程序设计》是面向本科高年级学生开设的课程,要求学生学过《操作系统》、《计算机网络基础》以及至少学过一门“高级语言程序设计”课程。

由于课程知识专业应用深度高,学生基础不一样,教学过程出现如下问题:(1)编程语言基础不牢固,编程容易出错,消弱了学习积极性。

学生在选修网络通信编程课程之前已开设过“C++程序设计”课程,但由于C++语言本身比较抽象,学习有难度,存在学生学习质量不高的症状。

由于语言基础不扎实,学生在网络编程课程学习中,容易出现程序语法上错误,调试程序占用较多时间,个体创新能力被限制,自然对课程的学习产生消极心理。

(2)学习方法不对,学生有死记硬背的现象。

学生习惯性的沿用了应试教育的思维,知识的接受上选择被动教育的方式,采用被动记忆程序的方法。

由于网络体系结构的复杂性及通信协议的多样性,网络通信编程有一定的灵活性,所以网络通信实例的开发注重编程模型的设计、编程流程的构思和开发方法的选择,这些很需要学生自主思维和创造思维的能力。

(3)实践教学环节薄弱,学生的实践动手能力有待提高。

计算机网络基础教程-第3章_网络体系结构与协议

计算机网络基础教程-第3章_网络体系结构与协议
6
7
3.1.2 网络系统的层次结构
3、通信规则约定 从以上邮政通信过程与网络通信过程分析可知,在一定意 义上,它们两者的信息传递过程有很多相似之处。 (1)邮政通信与网络通信两个系统都是层次结构,可等价 成4层结构的系统。 (2)不同的层次有不同的功能任务,但相邻层的功能动作 密切相关。 (3)在邮政通信系统中,写信人要根据对方熟悉的语言, 确定用哪种语言;在书写信封时,国家不同规定也不同。 (4)计算机网络系统中,必须规定双方之间通信的数据格 式、编码、信号形式;要对发送请求、执行动作及返回应答予 以解释;事件处理顺序和排序。
第3章 网络体系结构与协议
计算机网络经过40年的发展, 使得计算机网络已经 成为一个海量、多样化的复杂系统。计算机网络的 实现需要解决很多复杂的技术问题: 支持多种通信 介质;支持多厂商和异种机互联;支持人机接口等。 本章重点讨论计算机网络体系结构的形成、OSI/RM 与TCP/IP模型、网络地址的形成、域名地址、子网 技术等。 掌握:计算机网络体系结构的基本概念、IP地址、 子网技术、域名地址的使用等。 熟悉:OSI/RM参考模型、TCP/IP模型。 了解:OSI/RM与TCP/IP的相同点和不同点。
12
3.2.1 OSI/RM的基本概念
2、定义方法 在OSI标准中,采用的是三级抽象: 体系结构(Architecture) 服务定义(Service Definition) 协议规格说明(Protocol Specification) OSI标准可分为三大类型: (1)总体标准:具有总的指导作用; (2)功能标准:为满足特定应用而从基本标准中选择接 口关系和通信规则等方面的汇集。 (3)应用标准:为基本应用定义层与层之间的接口关系 和不同系统之间同层的通信规则。

网络通信协议

网络通信协议

网络通信协议网络通信协议是指计算机网络中设备之间进行通信所需遵守的规则,这些规则规定了通信设备如何建立连接,如何传输数据以及如何结束连接等各种细节。

通常情况下,网络通信协议是由软件组织实现的,这些软件组织在用户对网络进行传输数据时自动运行。

下面介绍一些常见的网络通信协议。

1. TCP/IP协议TCP/IP协议是Internet使用的基本协议,也是整个互联网的基础协议。

TCP/IP协议包括两个子协议,分别是TCP(Transmission Control Protocol)和IP(Internet Protocol)。

IP协议规定了数据如何在Internet上进行传输,而TCP协议则负责将应用程序的数据分割成一系列数据包,然后将这些数据包传输到目的地,并在目的地将它们重新组装。

TCP/IP协议是一种可靠的协议,可以确保数据的准确传输。

2. HTTP协议HTTP(Hypertext Transfer Protocol)协议是Web浏览器和Web服务器之间的通信协议,用于传输Web页面、图片、音频、视频及其他信息。

HTTP协议采用客户端-服务器模式,浏览器作为客户端向Web服务器发出请求,Web服务器将所需文件传输至客户端,完成数据传输后断开连接。

3. DNS协议DNS(Domain Name System)协议是IP地址和域名之间的解析协议。

DNS协议将域名解析为IP地址,使网络设备可以通过域名访问互联网上的各种资源。

DNS协议是一个分布式数据查询系统,它将全球的DNS服务器组成一个层次结构,并使用一种类似于树形的结构进行管理和组织。

4. FTP协议FTP(File Transfer Protocol)协议是一种用于计算机之间进行文件传输的通信协议。

FTP协议允许用户从远程计算机上下载文件,也可以将文件上传至远程计算机。

它提供了简单易用的命令来完成文件传输,支持基本认证和数据加密等功能。

5. SMTP协议SMTP(Simple Mail Transfer Protocol)协议是用于发送邮件的通信协议。

计算机网络课程设计实验报告

计算机网络课程设计实验报告

计算机网络课程设计报告姓名:学号:班级:指导老师:湖南科技大学计算机科学与工程学院2013年6月实验一1。

实验名称:网络聊天程序的设计与实现2。

实验目的:通过本实验能够了解socket通信的原理并在此基础上编写一个聊天程序了解TCP/IP的基础知识,发现TCP与UDP的优缺点以及在网络通信的应用.3.实验原理:从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。

当网络的边缘部分中的两个主机使用网络的两个主机使用网络的核心部分进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

从IP层来说,通信的两端是两个主机,IP数据报的首部明确的标志了这两个主机的IP地址.但是严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。

根据应用程序的不同需求,运输层需要有两种不同的运输协议,即是面向连接的TCP和无连接的UDP。

在使用这两个协议时运输层向高层用户屏蔽了下面的网络核心的细节,它使应用进程看见的就是好像在两个运输层实体间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别.当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。

但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道.由于我在课程设计中采用的是UDP协议进行通信的,这里就只简述一下一些关于UDP的内容,UDP在传送数据之前不需要先建立连接。

远地主机的运输层在收到UDP报文后,不需要给出任何确认。

虽然UDP不提供可靠的交付,但在某些情况下UDP却是一种最有效的工作方式.为此当我们使用UTP协议使两个计算机中的进程要互相通信,不仅必需知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。

计算机网络体系结构和网络功能的分层

计算机网络体系结构和网络功能的分层

计算机网络体系结构和网络功能的分层介绍计算机网络是由一组相互连接的计算机和网络设备组成,通过通信线路和交换设备相互连接,共享资源和信息。

为了有效管理和提供灵活的功能,计算机网络通常被组织成分层的体系结构。

本文将介绍计算机网络体系结构的分层以及每个层次的网络功能。

OSI模型最常用的计算机网络体系结构模型是国际标准化组织(ISO)制定的“开放式系统互连”(Open Systems Interconnection,简称OSI)模型。

该模型将计算机网络分为七个不同的层次,每个层次都有特定的功能和任务。

下面是OSI模型的七个层次:1.物理层:负责传输比特流,处理硬件的物理接口以及基本的电信号传输。

2.数据链路层:负责可靠传输数据帧,增加了流控制和差错检测等功能。

3.网络层:负责将数据分组(通常称为数据包或数据报)从源主机传输到目标主机,进行路径选择和数据包转发。

4.传输层:负责建立端到端的连接,提供数据传输的可靠性和流量控制。

5.会话层:负责建立、管理和终止不同计算机之间的会话。

6.表示层:负责数据的格式转换、加密和压缩等安全性和可读性相关的功能。

7.应用层:为用户提供各种网络应用程序,例如电子邮件、远程登录和文件传输等。

每个层次在进行通信时只与相邻的上下层进行交互,通过协议进行数据的传递和控制。

TCP/IP模型除了OSI模型外,另一个常用的计算机网络体系结构是TCP/IP模型。

TCP/IP模型是实际应用中最常见的网络体系结构,它是互联网的基础。

TCP/IP模型将计算机网络分为四个层次:1.网络接口层:负责通过物理媒介(例如以太网)传输数据,处理硬件寻址和数据包的物理传输。

2.网际层:负责将数据包从源主机传输到目标主机,进行路由选择和数据包转发。

3.运输层:负责建立端到端的连接,提供数据传输的可靠性和流量控制。

4.应用层:为用户提供各种网络应用程序,例如HTTP、FTP和DNS等。

与OSI模型相比,TCP/IP模型将会话层、表示层和应用层合并到了单一的应用层中。

网络程序设计_socket_复习题_考点_知识点

网络程序设计_socket_复习题_考点_知识点

Winsock是什么?• Windows下网络编程的规范• Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。

• 已成为Windows网络编程的事实上的标准。

Windows socket规范• Windows Socket规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。

Socket原理• Socket通常称为套接字、套管、插口,是两个程序间通信链路的端点。

• Socket实际上是一个编程接口,为网络应用程序提供各种接口函数。

Winsock基本概念• 多数网络协议都由软件实现,而且几乎所有计算机系统都将网络协议的实现作为操作系统的一部分,操作系统提供给用户的程序接口叫做应用程序编程接口(API )。

• 套接字接口(Socket Interface)就是一种API套接字及类型• 套接字(socket)是网络通信的基本构件,是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和与之相连的进程。

• 套接字存在于通信区域中,通信区域也称地址族• 套接字通常只与同一区域中的套接字交换数据(也可跨区域通信,但要执行某种转换进程之后才能实现)。

• TCP/IP的socket提供三种类型的套接字:流式套接字(SOCK_STREAM)• 提供一个面向连接的、可靠的数据传输服务,• 内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。

• 文件传输协议(FTP)即使用流式套接字。

数据报式套接字(SOCK_DGRAM)• 提供一个无连接服务。

• 数据报以独立包形式被发送,不提供无错保证,数据可能丢失或重复,且接收顺序混乱。

• 网络文件系统(NFS)使用数据报式套接字。

原始式套接字(SOCK_RAW)• 该接口允许对较低层协议,如IP、ICMP直接访问。

• 常用于检验新的协议实现或访问现有服务中配置的新设备。

 • 服务方式面向连接(虚电路)• 面向连接服务是电话系统服务模式的抽象,每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录一、实验名称:TCP文件传输程序 2二、实验要求 2三、总体规划 21、网络传输协议的选择 22、TCP协议在VC++中的实现 23、传输数据的缓冲问题 34、Socket的文件化管理 35、数据的串行化问题 46、接收数据判断是否传输完毕的方法 4四、实验运行测试 4五、心得体会 7六、程序源代码 71、建立服务器侦听套接字的类CListenSocket的定义与实现 72、建立数据传输套接字的类CTransSocket的定义与实现 83、用于数据串行化的类CSave的定义与实现: 84、主对话框CTcpDlg类的定义与实现: 9七、参考文献 18一、实验名称:TCP文件传输程序二、实验要求1、设计一个应用程序,该应用程序能够实现网络中两台计算机之间传输文件。

2、一个程序既能够建立服务器又能够以终端的形式连接服务器。

3、终端或者服务器既能够发送文件又能够接收文件。

4、传送文件类型应为任何类型,文件大小为任意。

三、总体规划1、网络传输协议的选择在TCP/IP协议栈中,有两个高级协议是我们网络应用程序编写者应该了解的,它们"传输控制协议"(Transmission Control Protocol,简称TCP)和"用户数据报协议"(User Datagrm Protocol,简称UDP)。

TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。

应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。

这个连接一但建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。

UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。

简单地说,如果一个主机向另外一台主机发送数据,这一数据就会立即发出,而不管另外一台主机是否已准备接收数据。

如果另外一台主机收到了数据,它不会确认收到与否。

为了使两台计算机之间传输的文件数据不会丢失或发生错误,应该采用TCP 协议。

2、TCP协议在VC++中的实现在VC++中,网络协议的实现有以下几种方式:a、采用WinSocket API函数。

API函数中提供了基本Socket的系统调用,具体实现方法为服务器端首先要调用socket()函数建立一个流式套接字,用bind()函数与本机的一个端口建立关联,继续调用listen()函数将套接字置于被动的侦听方式以监听连接,然后调用accept()函数进入等待状态之后才可以接收来自客户端的请求,一旦接收到客户端通过connect发出的连接请求,accept将返回一个新的套接字描述符。

通过此套接字描述符调用send()或recv()函数即可与客户端进行数据收发。

待数据传送完成,服务器客户端调用closesocket()关闭套接字。

该方法在编程过程中需要注意socket连接的整个过程,编程工作量大,编程效率低,单却可以加深对网络协议的认识。

程序流程示意图如下:b、采用VC++中提供的MFC类,CAsyncSocket或CSocket.两个类都对WinSocket API进行了封装,CSocket对它的封装比CAsyncSocket更深,使得对于从未接触过WinSockets API的编程程序员,也能够编写网络程序。

而本程序也是采用了CSocket类进行编程。

3、传输数据的缓冲问题本机要传给对方的文件不是从外存直接通过网络发送的,而对方发送的数据也不是直接存入外存的。

而是在内存中开辟一块缓冲区,从外存取出的文件先存入缓冲区,然后传给socket。

而从socket接收的数据也是先存入缓冲区然后再存到外存。

为了解决缓冲问题,VC++添加了CArchive类,CArchive类专门用来管理一块内存单元,其大小可以自己来定义。

用CArhive类既以把数据载入分配的内存区,又可以将内存区的数据存入文件。

在该类的对象初始化时,需要和某个文件建立连接,这样数据就可以载入或存储了。

4、Socket的文件化管理在大多数编程环境和编程语言中大多把socket看作一个特殊的文件,其传输过程就可以看作是对文件的读写操作。

而VC++也是如此。

为了便于网络Socket的管理,在VC++中,可以对网络Socket实现文件化管理。

为了实现该功能,需要用到VC++中的类CSocketFile类,该类直接派生于CFile类,使用该类可以达到对Socket文件化管理的目的。

如CSocketFile类可以与CArchive类建立连接,这样就为Socket创立了一块缓冲区。

应该注意的是虽然CSocketFile类直接从CFile类中派生过来,但CFile类中的一些函数CSocket 是不能调用的,如果调用,系统便会返回错误。

5、数据的串行化问题从对方的计算机传输过来的数据存入了内存,如何将这些数据写入文件呢?要发送的文件如何将其载入内存?在这个程序里我采用了数据串行化方法。

也就是通过对象的Serialize()的重载来实现文件的存取。

我在程序中采用了通过重载CObject类中的Serialize()的方式,具体做法是:从文件中读取文件数据存入数组,利用CArchive的重载运算符 << ,将数组数据读入内存,而存数据过程与其相反。

6、接收数据判断是否传输完毕的方法文件接受数据时怎样才能判断已经接受完毕呢?我采用的方法是在传输包上加标记位的方法。

每发送一个数据包,总在最前面加一个位m_WEnd,如果标记为0,说明未传输完毕,以后还有数据传送过来,如果标记为1,说明已经传输完毕,可以进行一些后续工作。

而另一端,每接受一个数据包,就检查以下该标记位,以确定是否传输完毕。

四、实验运行测试1、建立服务器2、客户端建立连接3、发送文件a、客户端发送b、服务器端接收4、成功发送5、在E:盘中查找接收到的文件五、心得体会在这五天的时间里我按照设计书的要求应用网络编程的相关知识编写了一个实现文件传输的应用程序。

在编写过程中,收获颇丰。

首先是对TCP协议和UDP协议有了更进一步的认识;其次在编写过程中,通过翻阅书籍学习了VC++编程和MFC 的相关内容,拓展了自己的知识面,学到了很多在课堂上无法学到的东西。

当然,由于对Socket编程毕竟还不太熟练,难免会出现一些问题,现将这些问题总结如下:1、开始时在数据串行化的设计时,直接用CArchive类的对象 << CFile类的对象或 CArchive类的对象 >> CFile类的对象出现错误,查阅MSDN发现不能直接用 << 运算符不能直接对CFile类的对象进行操作。

2、接收端操作同数据的传输必须同步,即必须确保在接收数据时,应确保数据已经传送到了接收端,也就是防止因为数据为传送过来而导致的接收失败。

为了防止接收失败而导致数据丢失,应反复接收,直到接收数目符合为止。

如:i = 0;while(i < m_WNum)i = ar.Read(&Bbuf[i], m_WNum - i) + i;所幸的是这些问题都在参考资料和老师的帮助下得到了解决。

最终圆满的完成了课程设计任务书的要求。

自身分析问题和解决问题的能力也得到了提升,为以后的实验设计奠定了良好的基础。

在这里要感谢老师对我的悉心指导,您辛苦了!六、程序源代码1、建立服务器侦听套接字的类CListenSocket的定义与实现定义部分:class CListenSocket : public Csocket//该类用于服务器端的侦听{public:CTcpDlg *m_pSendDlg; //加该成员为了调用其内的函数。

public:CListenSocket(CTcpDlg *pSendDlg);virtual ~CListenSocket();public:virtual void OnAccept(int nErrorCode);};实现部分:CListenSocket::CListenSocket(CTcpDlg *pSendDlg){m_pSendDlg = pSendDlg;}void CListenSocket::OnAccept(int nErrorCode) //当服务器端收到客//户端的连接请求时执行的代码。

{CSocket::OnAccept(nErrorCode);m_pSendDlg->ProcessAccept();}2、建立数据传输套接字的类CTransSocket的定义与实现定义部分:class CTransSocket : public Csocket//该类用于两端的连接和传输{public:CTcpDlg *m_pSendDlg;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::OnR eceive(nErrorCode);m_pSendDlg->SetTip(CString("有数据传送到"));m_pSendDlg->SendOrRecv = 2;m_pSendDlg->JudgeButton();}3、用于数据串行化的类CSave的定义与实现:定义部分:class CSave : public CObject{public:WORD m_WEnd; //标记数据传输是否结束,结束-0 未结束-1 意外-2WORD m_WNum; //标记Bbuf[]中元素的个数BYTE Bbuf[1024];public:CSave();virtual ~CSave();void Init();virtual void Serialize(CArchive &ar);};实现部分:CSave::CSave(){Init();}void CSave::Init() //重新定义一个Init()的原因是不仅在CSave类初始{ //化时将类内各变量值初始状态,还可以在以后也可int i; //以。

m_WEnd = 1; //结束标志for(i = 0; i < 1024; i++)Bbuf[i] = 0;}void CSave::Serialize(CArchive &ar) //数据串行化{unsigned int i = 0;if(ar.IsStoring()){ar << m_WEnd;ar << m_WNum;for(i = 0; i < m_WNum; i++) //数组中的值发送出ar << Bbuf[i];}else{i = 0;ar >> m_WEnd;ar >> m_WNum;while(i < m_WNum) //收到的值存入数组i = ar.Read(&Bbuf[i], m_WNum - i) + i;}}4、主对话框CTcpDlg类的定义与实现:定义部分:class CTcpDlg : public CDialog{系统定义部分省略...public:CListenSocket *m_pListenSocket;CTransSocket *m_pTransSocket;CSocketFile *m_pFile; //用于和CSocket连接CFile *m_pBasicFile;CArchive *m_pArchiveIn; //CSocket的两个缓冲区CArchive *m_pArchiveOut;CString m_strFileName; //用于存储文件名int SendOrRecv; //send 1; receive 2; nothing 0; int ServerClient; //Server-1,Client-2int iEnd; //用于控制意外中断发送信号int m_nPort;void ProcessAccept();void ProcessRecv();void InitConnection();BOOL ConnectSocket(CString strIP);void SendFile(CString strFileName, WORD WEnd = 1);int ReceiveFile(CFile *m_pBasicFile,CString strFileName, DWORD *wNum);void JudgeButton();void SetTip(CString str);public:CTcpDlg(CWnd* pParent = NULL); // standard constructorvirtual ~CTcpDlg();系统控件变量定义省略...系统定义函数省略...protected:afx_msg void OnBUTTONListen();afx_msg void OnBUTTONStop();afx_msg void OnBUTTONConnect();afx_msg void OnBUTTONCut();afx_msg void OnBUTTONBrowser();afx_msg void OnBUTTONSend();afx_msg void OnBUTTONSave();afx_msg void OnBUTTONRecv();};实现部分:系统定义函数实现省略...CTcpDlg::CTcpDlg(CWnd* pParent /*=NULL*/): CDialog(CTcpDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pAutoProxy = NULL;m_pListenSocket = NULL;m_pTransSocket = NULL;m_pFile = NULL;m_pArchiveIn = NULL;m_pArchiveOut = NULL;m_strFileName.Empty();m_pBasicFile = NULL;SendOrRecv = 0;iEnd = 1;}CTcpDlg::~CTcpDlg(){if (m_pAutoProxy != NULL)m_pAutoProxy->m_pDialog = NULL; delete m_pTransSocket;m_pTransSocket = NULL;delete 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(192,168,0,1);JudgeButton();SetTip(CString("初始状态"));return TRUE;}void CTcpDlg::JudgeButton() //不时地调整各按钮的状态{if(m_pListenSocket == NULL && m_pTransSocket == NULL){m_Browser.EnableWindow(TRUE);m_Listen.EnableWindow(TRUE);m_Stop.EnableWindow(FALSE);m_Connect.EnableWindow(TRUE); m_Cut.EnableWindow(FALSE);m_Send.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);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.EnableWindow(FALSE); 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.EnableWindow(TRUE); m_Save.EnableWindow(FALSE);}else if (SendOrRecv == 2){m_Recv.EnableWindow(TRUE);m_FileName.EnableWindow(FALSE); m_SaveFile.EnableWindow(TRUE); m_Browser.EnableWindow(FALSE); m_Save.EnableWindow(TRUE);}else{m_Recv.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE); m_SaveFile.EnableWindow(TRUE);m_Browser.EnableWindow(TRUE);m_Save.EnableWindow(TRUE);}m_Send.EnableWindow(TRUE); return;}else if(m_pListenSocket != NULL) {m_Browser.EnableWindow(TRUE);m_Listen.EnableWindow(FALSE);m_Stop.EnableWindow(TRUE);m_Connect.EnableWindow(FALSE); m_Cut.EnableWindow(FALSE);m_Send.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE); m_SaveFile.EnableWindow(TRUE);m_Recv.EnableWindow(FALSE);return;}}void CTcpDlg::SetTip(CString str) //调整状态区的文字显示{m_EditTip.SetWindowText(str);}void CTcpDlg::ProcessAccept() //应答客户端的连接请求{m_pTransSocket = new CTransSocket(this);if(m_pListenSocket->Accept(*m_pTransSocket)){InitConnection();m_pListenSocket->Close();delete m_pListenSocket;m_pListenSocket = NULL;JudgeButton();SetTip(CString("有客户端连接"));}else{delete m_pListenSocket;m_pListenSocket = NULL;delete m_pTransSocket;m_pTransSocket = NULL;JudgeButton();SetTip(CString("连接失败"));}}void CTcpDlg::InitConnection()//初始化CSocket缓冲区及与CSocketFile{ //的连接。

相关文档
最新文档