应用C++多人聊天室的构建
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多人聊天室的构建
——基于CAsyncSocket 类的Windows Sockets编程
[提要]本章介绍了Socket的工作机制和基于CAsyncSocket 类的Sockets编程的基本方法。通过一个应用实例,编写服务端和客户端代码,实现多人之间信息传递。
一、TCP/IP 体系结构与特点
1、TCP/IP体系结构
TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务,而IP则是提供网络层服务。TCP/IP包括以下协议:(结构如图1.1)
(图1.1)
IP:网间协议(Internet Protocol),负责主机间数据的路由和网络上数据的存储。同时为ICMP,TCP,UDP提供分组发送服务。用户进程通常不需要涉及这一层。
ARP:地址解析协议(Address Resolution Protocol),此协议将网络地址映射到硬件地址。
RARP:反向地址解析协议(Reverse Address Resolution Protocol),此协议将硬件地址映射到网络地址
ICMP:网间报文控制协议(Internet Control Message Protocol),此协议处理信关和主机的差错和传送控制。
TCP:传送控制协议(Transmission Control Protocol),这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。(注:大多数网络用户程序使用TCP)
UDP:用户数据报协议(User Datagram Protocol),这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。
FTP:文件传输协议(File Transfer Protocol),允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。
SMTP:简单邮件传送协议(Simple Mail Transfer Protocol),SMTP协议为系统之间传送电子邮件。
TELNET:终端协议(Telnet Terminal Procotol),允许用户以虚终端方式访问远程主机。
HTTP:超文本传输协议(Hypertext Transfer Procotol)
TFTP: 简单文件传输协议(Trivial File Transfer Protocol)
2、TCP/IP特点
TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。
图1.2是TCP/IP协议核心与应用程序关系图。
二、套接字工作方式
1、客户机/服务器模式
在TCP/IP网络中两个进程间相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务:(过程如下)
①打开一通信通道(端口)并告知本地主机,并在某一个公认地址上接收客户请求;
②等待客户请求到达该端口;
③接收到重复服务请求,处理该请求并发送应答信号;
④返回第二步,等待另一客户请求
⑤关闭服务器。
客户方:
①打开一通信通道,并连接到服务器所在主机的特定端口。
②向服务器发送服务请求报文,等待并接收应答;继续提出请求……
③请求结束后关闭通信通道并终止。
2、典型过程图
⑴面向连接的套接字的系统调用时序图
(图1.3) ⑵无连接协议的套接字调用时序图
(图1.4)
三、Windows套接类——CAsyncSocket类
1、CAsyncSocket类介绍
CAsyncSocket 类封装 Windows Sockets API。 CAsyncSocket 适合那些对网络通信细节了解,希望利用回调的便利通知网络事件的程序员使用。如果想利用 Windows Sockets 方便地处理 MFC 应用程序中的多个网络协议,而又不想放弃灵活性,可以考虑使用 CasyncSocket类。其在MFC中的类层次为:
Cobject
└CasyncSocket
2、CAsyncSocket类的主要成员函数
构造函数
CasyncSocket:构造CAsyncSocket对象
Create:创建套接字
属性操作函数:
Attach:对CAsyncSocket对象附加套接字句柄
Detach:从CAsyncSocket对象除去套接字句柄
FromHandle:返回CAsyncSocket对象的指针,给出套接字句柄
GetLastError:获得上一次运行失败的状态
GetPeerName:获得与套接字连接的对等套接字的地址
GetSockName:获得套接字的本地名
GetSockOpt:获得套接字选项
SetSockOpt:设置套接字选项
成员函数:
Accept:接受套接字上的连接
AsyncSelect:请求对于套接字的事件通知
Bind:与套接字有关的本地地址
Close:关闭套接字
Connect:对对等套接字建立连接
IOCtl:控制套接字模式
Listen 建立套接字,侦听即将到来的连接请求
Receive 从套接字接收数据
ReceiveFrom 恢复数据报并且存储资源地址
Send 给连接套接字发送数据
SendTo 给特定目的地发送数据
ShutDown 使套接字上的Send和/或Receive调用无效
虚函数:
OnAccept:通知侦听套接字,它可以通过调用Accept,接受挂起连接请求
OnClose:通知套接字,关闭对它的套接字连接
OnConnect:通知连接套接字,连接尝试已经完成,无论成功或失败
OnOutOfBandData:通知接收套接字,在套接字上有带外数据读入,通常是忙消息
OnReceive:通知侦听套接字,通过调用Receive恢复数据
OnSend:通知套接字,通过调用Send,它可以发送数据
数据成员
m_hSocket:指定附加在此CAsyncSocket对象上的SOCKET句柄
3、使用 CasyncSocket