局域网通信工具
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章引言
1.1 课题背景及意义
即时聊天工具是一种可以让使用者在网络上实时通讯的工具,大部分的即时通讯工具提供了状态信息的特性,如显示联络人名单,联络人是否在线及能否与联络人交谈等。
目前在互联网上受欢迎的即时通讯软件包括百度QQ、MSN Messe nger、Yahoo! Messenger、AOL Instant Messenger、NET Messenger Service、Jabber、ICQ等。
在本文中将讨论一种基于MFC Socket的局域网通信工具的设计与实现方法。
基于MFC Socket的局域网通信软件可以为局域网提供一种良好、安全、快速的通信机制,在局域网内部通信、教学、讨论等应用中都具有一定的实用价值,它同时很好地诠释了MFC Socket通信的原理。
基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。
1.2 课题现状
基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟,比如较早的ICQ、MSN Messenger、YAHOO通等国外开发的产品,还有国产的有名的QQ、新浪UC、LAVA-LAVA等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等,而QQ也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。
这些软件,在使用方面各有特色,在实现方面也各有所长,但由于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UD P/IP协议的软件产品。
在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要简单,但是可以借此理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。
1.3 开发平台、开发技术的介绍
1.3.1 Windows Socket 网络编程简介
Windows Sockets 规范以U.C. Berkeley 大学BSD UNIX 中流行的Sock et 接口为范例定义了一套开放的、支持多种协议的、Microsoft Windows 下的网络编程接口,并不是一种网络协议。
它不仅包含了人们所熟悉的Berkeley Socket 风格的库函数;也包含了一组针对Windows 的扩展库函数,以使程序员能充分地利用Windows 消息驱动机制进行编程。
Windows Sockets 规范本意在于提供给应用程序开发者一套简单的API,使应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。
现在的Windows Sockets已经基本上实现了与协议无关,你可以使用Windows Sockets来调用多种协议的功能,但较常使用的是TCP/IP协议。
Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。
应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
微软为VC定义了Windows Sockets类如CAsyncSocket类和派生于CAsy ncSocket 的CSocket类,它们简单易用。
1.3.2 VC++ 6.0 简介
我们通常所说的Visual C++实际上是一个完善的、非常强大的C++程序开发环境,它的名字是Microsoft Developer Studio 。
二者之间的细小差别并不重要,通常这两个术语可以互换。
但如果你不围绕Developer Studio 来进行学习,就不能有效地使用Visual C++(Developer Studio 听起来很像Visu al Studio ,但它们之间没有关系)。
它包含:C++编译器、调试器、应用程序框架生成器、项目管理器、设计和实现菜单等资源的编辑器等等
第二章需求分析及可行性研究
2.1 需求分析
2.1.1 功能需求分析
(1)用户端之间的信息发送,本程序需要实现的最基本的功能。
用户在界面上选择需要对话的IP,并将自己需要发送的信息填入相应的对话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息,预计利用TCP/IP协议中的UDP协议,在本程序中共需要3个端口,此功能预计使用3号端口。
(2)在线用户主机IP列表的维护。
在用户发送信息之前,需要选择相应的目的地端IP,这也就需要客户端拥有在线用户主机的IP地址,这个在线主机列表的维护是需要客户端定时自动向服务器端发送信息,服务器端收集并维护在线用户列表,再发送回客户端。
需要在客户端和服务器端都使用定时器来完成此功能。
此功能预计使用1、2号端口。
(3)在C/S模式中,服务器与客户端是相互依赖的。
在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。
在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。
2.1.2 数据需求分析
(1)客户端之间聊天信息。
在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。
(2)在线用户列表信息。
服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。
(3)客户端向服务器端发送的确认在线信息。
包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。
(4)其它程序内部可能需要设计的数据结构体。
2.1.3 性能需求分析
(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。
在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。
(2)宜操作性,程序简单易懂,容易上手使用。
设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。
(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的理解整个系统的设计思路和实现细节。
(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。
2.1.4 运行需求分析
(1)用户界面
程序较小,启动速度快,无启动界面。
在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。
(2)故障处理
在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。
2.2 可行性研究
2.2.1 成本可行性
学习研究性开发,暂不考虑成本。
2.2.2 技术可行性
已有搭建好的基于Windows的软硬件平台,本人对VC开发环境有一定的了解,需继续深入学习VC和Windows socket 编程。
第三章相关开发技术的原理性说明
3.1 Win32编程(即SDK程序设计原理)
所谓的Win32开发,就是在C语言的层面上,直接使用Win32 API(Applic ation Programming Interface:系统开放出来,给程序员使用的接口。
)开
发Windows应用程序或者系统程序。
虽然现在直接用Win32 API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为W indows开发高手的良好途径。
所谓的Win32,其实是一个API规范,与UNI X系统编程接口标准POSIX是相对应的。
下面是进行直接的WIN32 SDK方式编程的基本思路或者说是一个框架。
一个WINDOWS程序分为程序代码和UI(User Interface 用户接口)资源两大部分,两部分最后以RC编译程序编译为一个完整的EXE文件。
所谓UI资源是指功能菜单、对话框外貌、程序图标、光标形状等等。
这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp . cur等等。
程序员必须在一个所谓的资源描述档(.rc )中描述它们。
RC编译器(RC.EXE )读取RC 文件的描述后将所有UI资源文件集中制作出一个.R ES 文件,再与程序代码结合在一起,这才是一个完整的Windows可执行文件。
如下图所示:
(附件—图1)
Windows程序将会调用许多的函数,来实现其一定的功能,这些函数可分为C Runtimes以及Windows API两大部分,而API由操作系统本身来提供,包括GDI32.LIB、USER32.LIB、KERNEL32.LIB、COMDLG32.LIB、TH32. LIB等等,前三个为Windows的三大模块所对应的import函数库。
“以消息为基础,以事件为驱动。
”Windows程序依靠外部发生的事件来驱动,也就是说:程序不断的等待消息,外部事件以消息的形式进入系统后放入相应的队列,然后程序调用Getmessage API取得相应的消息并做出相应的处理。
窗口是用来接受并处理消息的,每个窗口都对应一个函数来处理消息,程序员必须设计这个窗口函数(windows procedure)。
如下图所示,Windows程序与OS之间的关系是:
(附件—图2)
一、WinMain函数
main()函数是C程序的进入点,而WinMain函数是Windows程序的进入点,
二、MSG结构体
定义了一个MSG结构体,是Windows内设的一种数据格式:
三、注册窗口
RegisterClass()完成注册窗口类的功能,设定窗口的属性:边框、颜色、标题、位置等等。
四、创建窗口
CreateWindow函数可以用于创建父窗口、弹出窗口以及子窗口,在创建窗口时它可以确定窗口类、窗口标题、窗口风格、大小以及初始化位置。
五、显示窗口
创建窗口后需要使用ShowWindow用于显示窗口。
六、刷新窗口
调用UpdateWindow函数来刷新窗口。
七、消息循环
初始化工作完成后,WinMain进入所谓的消息循环,使用while循环,不断的GetMessage,再使用TranslateMessage将消息转化,用DispatchMessag e将消息传递给窗口函数去处理。
八、获取消息
GetMessage功能函数从消息队列中获取消息,如果消息队列中没有消息,此功能函数则会一直等得消息。
九、转换消息
将特定的消息转换为不同的消息,例如消息队列中同时有WM_KEYDOWN和W M_KEYUP消息时,意味着用户同时按下了键盘上的某几个键,此时TranslateM essage将其转换为一个WM_CHAR消息。
十、将消息发送到回调函数
DispatchMessage通过USER模块的协助将消息送到该窗口的窗口函数去了,但是DispatchMessage并没有指定函数名,却可以将消息传送过去,这是因为消息发生的时候,OS已经根据当时状态,为它标明了所属窗口,而窗口所属的窗口类亦是明确的。
十一、WinMain函数返回值
return msg.wParam; //返回结构体变量msg中的wParam的值。
十二、WindowProc窗口函数
窗口中的生命枢纽:窗口函数WindowProc。
WindowProc是一个callback
函数,常利用switch/case方式判断消息的种类,以决定处理方式。
3.2 MFC (Microsoft Foundation Class) 3.2.1 简介
MFC是在1992年随微软的Microsoft C/C++ 7.0编译器发布的,是建立在Windows API之上的C++ 类库(C++ Class Library),意图是使Windo ws程序设计过程更有效率,更符合面向对象的精神。
现在MFC已经成为了Wi ndows环境上标准的C++ API。
MFC使得开发Windows应用程序变得简单容易,将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。
同时,在Visual C++内部也内建了很多对MFC的非常实用的东西,例如类向导这样的支持,减少软件开发的时间,使用类向导可以生成从hel lo world这样的简单程序到活动文档服务器这样的复杂程序。
MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。
MFC在整个Windows家族中都是兼容的。
3.2.2 MFC与C 语言API 的关系
设置Microsoft 基本类库与其它Windows 类库所不同的唯一特征就是它与C 语言编写的Windows API 的紧密的映射关系。
而且,可以将直接调用Windo ws API 与调用类库自由地混合起来使用。
这种直接访问并不意味着类可以完全取代API。
开发者有时必须直接调用一些Windows函数,例如,SetCursor 和GetSystemMetrics。
只有在有明显优势时,一个Windows 函数才被一个类成员函数所替代。
3.2.3 MFC类库
MFC类库是一个很大的、扩展了的C++类层次结构,与传统上使用C 语言直接访问Windows API 相反,MFC已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用C编写的Windows 程序所必需的,因此用MFC 编写的程序要比用C 语言编写的程序小得多,当然MFC 所编写的程序的性能也毫无损失。
必要时,也可以MFC可以用面向对象的方法来调用Windows API,因为MFC 不修改也不隐藏Windows 程序的基本结构。
MFC 是很庞大的。
例如,版本4.0 中包含了大约200个不同的类。
事实上,你可能只需要使用其中的十多个不同的类,就可以建立一个非常漂亮的程序。
MFC层次结构大约可分为几种不同的类型的类:
(1)根类:Cobject
Microsoft 基本类库中的大多数类都是由在类层次表中根上的唯一的一个基类派生而来的。
(2)MFC 应用结构类
MFC 应用构造类有助于一个框架应用的构造。
它们对大多数应用提供了通用功能。
可以在框架中填写对于应用特定的功能。
(3)窗口、对话和控件类
类CWnd 和它的派生类封装了HWND,它是一个Windows 窗口。
CWnd可被自己使用,也可以作为派生新类的基类。
类库提供的派生类表示各种窗口。
C Wnd是所有窗口的基类。
可以使用CWnd 派生出来的一个类,也可以从其中派生出自己的类。
(4)绘画和打印类
在Windows 中,所有的图形输出都是在一个可视的绘图区上。
这叫作一个设备上下文(或DC)。
MFC 提供了封装不同DC 类型的类,也提供了对Wind ows 绘图工具,例如位图、刷子、调色板和笔的封装。
(5)文件和数据库类
这些类允许将信息存储在一个数据库或一个磁盘文件中。
有两个数据库类的集合──DAO 和ODBC──它们提供了相似的功能。
(6)Internet 和网络类
这些类允许和其它使用ISAPI 的计算机或一个Windows Socket 交换信息。
还有创建ISAPI 扩展DLL 的类的集合和操作Windows 套接字的类的集合。
支持连接的类的分类:ISAPI 类、Windows 套接字类、Win32 Internet 类。
(7)其它还有简单的数据类型类、OLE 类、调试和异常类、数组列表和映射类。
3.3 TCP/IP协议及WINDOWS SOCKETS 网络编程接口
3.3.1 TCP/IP协议简介
(1)TCP/IP协议
通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。
这些协议的示例是:UDP(User Datagram Protocol)协议、ICMP(Internet Control Messa ge Protocol)协议、ARP(地址解析协议)和其他一些协议的协议组。
应用的
示例:telnet(远程登录)、ftp(文件传递协议)、http等。
这其中一些协议最早发源于美国国防部的ARPA网项目。
(2)逻辑结构:
(附件—图3)
这是TCP/IP协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。
这样的分层结构决定了计算机在internet 上互相通信的方式。
数据通过这样的分层结构从上层传到底层,然后通过网线把数据传送出去。
底层的水平线代表以太网网线,“O”代表收发器,“*”代表IP地址,“@”代表网址,理解这样的分层结构是理解INTERNET技术的基础。
(3)本论文涉及到的协议:IP、UDP
IP(Internet Protocol)是TCP/IP的心脏,也是网络层中最重要的协议。
I P层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。
IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
UDP(IP协议号17)是一个无连结的数据报协议。
它是一个“best effort”或者“不可靠”协议——不是因为它特别不可靠,而是因为它不检查数据包是否已经到达目的地,并且不保证它们按顺序到达。
UDP的典型性应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如DNS查找这样的简单查询/响应应用,如果需要建立可靠的连结,哪么所作的额外工作将是不成比例地大。
本程序只应用于局域网中,局域网中的数据流传输的可靠性高,故选择UDP协议。
3.3.2 WINDOWS SOCKETS网络编程接口概述
(1)WINDOWS SOCKETS简介
Windows Sockets:用于Microsoft Windows环境下的网络计算的开放接口。
Windows Sockets规范为Microsoft定义了一个二进制兼容网络编程接口,基于Berkeley Software Distribution中的UNIX 套接字实现,通过使用Windows Sockets,应用程序能够在任何符合Windows Sockets API 的网络上通信。
许多网络软件供应商支持网络协议下的Windows Sockets,这些协议包括:传输控制协议/网际协议(TCP/IP)和Novell Corporation 的互联网包交换
协议/顺序分组报文交换协议(IPX/SPX) 等。
虽然目前的Windows Socket s 规范定义了TCP/IP 的套接字抽象化,但任何网络协议都可以通过提供自己版本的、实现Windows Sockets 的动态链接库(DLL)来满足Windows So ckets。
因为套接字使用网际协议组,所以它们对于支持“信息高速公路”上Int ernet通信的应用程序是首选方式。
套接字是一个通信终结点,它是Windows Sockets 应用程序用来在网络上发送或接收数据包的对象。
套接字具有类型,与正在运行的进程相关联,并且可以有名称。
目前,套接字一般只与使用网际协议组的同一“通信域”中的其他套接字交换数据。
可用的套接字类型有以下两种:流式套接字,提供没有记录边界的数据流,即字节流;数据文报套接字,支持面向记录的数据流,但不能确保能被送达,也无法确保按照发送顺序或不重复,可靠性在局域网(LAN)上往往很好,但在广域网(WAN)上却不太好。
数据文报为“无连接”的,也就是不建立显式连接。
可将数据文报消息发送到指定的套接字,然后从指定的套接字接收消息。
(2)相关MFC类
MFC 为使用Windows Sockets 编写网络通信程序提供了两种模型,内嵌在两个MFC 类中。
CAsyncSocket
该类封装Windows Sockets API。
CAsyncSocket 是为那些了解网络编程并希望能够灵活地对套接字API 直接编程,同时还希望方便地使用回调函数以进行网络事件通知的程序员提供的。
除了将套接字打包为面向对象的形式以用于C++ 外,此类提供的唯一附加抽象化是将某些与套接字相关的Windows 消息转换为回调。
CSocket
从CAsyncSocket 派生出的高水平抽象概念,它通过MFC CArchive 对象提供与套接字一起使用的更高级的抽象化。
使用带存档的套接字与使用MFC 的文件序列化协议非常相似。
这使它比CAsyncSocket 模型更易于使用。
它是同步运行的。
(3)WinSocket编程一般流程(基于UDP)
本程序选择使用CSocket类,基于UDP的编程。
对于在一个无连接套接字上接收数据的进程来说,步骤并不复杂。
先用WSAStartup来加载Winscock D LL相应版本,然后用socket或WSASocket建立套接字。
再把这个套接字和准备接收数据的接口绑定在一起。
这是通过bind函数来完成的。
最后在使用完Winscock DLL需要调用WSACleanup,将资源释放。
和面向连接会话不同的是,我们不必调用listen和accept。
①Winsock的初始化
每个Winsock应用都必须加载Winsock DLL的相应版本。
如果调用Winsoc k之前,没有加载Winsock库,这个函数就会返回一个SOCKET_ERR,错误信息是WSANOTINITIALISED。
加载Winsock库是通过调用WSAStartup 函数实现的。
这个函数的定义如下:
int WSAStartup(WORD wVersionRequested , LPWSADATA lpWSAD ata);
②创建套接字
SOCKET socket(int af, int type, int protocol);
③把套接字和准备接收数据的地址、接口绑定在一起
int bind (SOCKET s, const struct sockaddr FAR *name, int namel en);
④发送数据
int sendto (
SOCKET s, //一个可用的SOCKET
const char FAR *buf, //需要传输的数据
int len, //传输数据的长度
int flags, //标记
const struct sockaddr FAR *to, //指向存有目的ip和端口的结构体
int tolen //目的地址的长度
);
⑤接收数据
int recvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen);
⑥事例:详见附录
3.4 多线程技术
3.4.1 进程及线程概述
进程和线程都是操作系统的概念。
每个进程是由一个或多个线程、私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。
进程是应用程序的执行实例。
线程是进程内的执行路径,也是Win32 安排的最小执行单元。
线程包括堆栈、CPU 寄存器的状态和系统计划程序执行列表中的项。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的,此线程终止时,进程也终止。
用户可以根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中,所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,但是必须使用信号灯或其他进程间的通信方法协调它们的工作。
一般情况下进程中的每个线程都独立运行的,对进程中的其他线程一无所知,除非使这些线程相互可见。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。
要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。
由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。
这一点在多线程编程时应该注意。
3.4.2 MFC对多线程编程的支持
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。
Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。
(附件—图4)
CWinThread对象代表在一个应用程序内运行的线程。
运行的主线程通常由C WinApp 的派生类提供;CWinApp由CWinThread派生。
另外,CWinThre ad对象允许一给定的应用程序拥有多个线程。
CWinThread支持两种线程类型:工作者线程和用户界面线程。
工作者线程没有收发消息的功能:例如,在电子表格应用程序中进行后台计算的线程。
用户界面线程具有收发消息的功能,并处理从系统收到的消息。
CWinApp及其派生类是用户界面线程的例子。
其它用户界面线程也可由CWinThread 直接派生。
C
WinThread类的对象存在于线程的生存期。
如果你希望改变这个特性,将m_ bAutoDelete设为FALSE。
要使你的代码和MFC是完全线程安全的,CWinThread类是完全必要的。
框架使用的用来维护与线程相关的信息的线程局部数据由CWinThread 对象管理。
由于依赖CWinThread来处理线程局部数据,任何使用MFC 的线程必须由M FC创建。
例如,由运行时函数_beginthreadex创建的线程不能使用任何MF C API。
为了创建一个线程,调用AfxBeginThread函数。
根据你需要工作者线程还是用户界面线程,有两种调用AfxBeginThread 的格式。
如果你需要用户界面线程,则将指向你的CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。
如果你需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。
对于工作者线程和用户界面线程,你可以指定可选的参数来修改优先级,堆栈大小,创建标志和安全属性。
AfxBeginThread线程将返回指向新的CWinThread对象的指针。
与调用AfxBeginThread相反,你可以构造一个CWinThread派生类的对象,然后调用CreateThread。
如果你需要在连续创建和终止线程的执行之间重复使用CWinThread对象,这种两步构造方法非常有用。
创建线程也可以使用API函数:CreateThread函数完成,本程序使用的就是此函数。
其它还有挂起线程、结束线程等函数,在本程序中没有涉及到,将不再一一详解。
第四章概要设计
4.1 总体设计
4.1.1 客户端与服务器端的信息交流
启动客户端后与服务器端的信息交换流程图:。