当前位置:松语文学 > 其他类型 >VC++_6.0程序设计从入门到精通最新章节 > VC++_6.0程序设计从入门到精通TXT下载
错误举报

第 59 章

  接字。

  ? ncom:要连接服务器的套接字地址结构。

  ? ncomlen:ncom 参数的长度。

  如果连接成功,此函数返回0;失败则返回SOCKET_ERROR。

  对于服务器来说,当客户机发来连接请求后,服务器要调用accept()函数来响应对方的连

  接请求,该函数原型如下:

  SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);

  各参数意义如下。

  ? s:处在jiān tīng(下小节介绍)模式下的套接字。

  ? addr:在函数调用过程中被填充发出连接请求的客户机的IP 地址信息。

  ? addrlen:addr 参数的长度。

  如果成功,则返回一个新的套接字,它对应于已经接受的那个客户机连接。对于该客户

  机所有的后续cāo作,都使用这个新的套接字。原来的套接字则仍处于jiān tīng模式,继续接受其

  他客户机的连接。如果失败,则返回INVALID_SOCKET。

  11.2.5 jiān tīngsocket

  对于服务器端来说,在它接受客户机的连接之前,首先要jiān tīng。只有进入了jiān tīng模式,

  才能接受来自客户机的连接。这一点可以通过listen()函数实现,它的原型如下:

  int listen(SOCKET s, int backlog);

  各参数意义如下。

  ? s:进行jiān tīng的套接字。

  ? backlog:正在等待连接的最大队列的长度。如果backlog 的值为3,有4 个客户机同

  时发出连接请求,则前3 个会放在等待连接队列中,最后一个将被忽略。

  如果函数成功,则返回0;否则返回SOCKET_ERROR。

  11.2.6 数据传输

  当客户机和服务器的连接建立起来以后,便可以进行数据的传输。数据的传输是网络通

  信的最终目的,前面所作的工作就是为了客户机可以和服务器传输数据。数据传输又包括数

  据发送和数据接收。

  1.数据发送

  数据发送是通过send()函数来实现的,它的原型如下:

  int send(SOCKET s, const char FAR *buf, int len, int flags);

  各参数意义如下。

  ? s:已经建立连接的套接字。

  ? buf:字符缓冲区,区内包含即将发送的数据。

  ? len:缓冲区内的字符数目。

  ? flags:指定数据传输方式,取值可为0、MSG_DONTROUTE 和MSG_OOB,或者是

  枫叶文学网www.fywxw.com

  第11 章 网络编程

  ·285·

  这些取值进行按位或运算的结果。其中,0 表示无特殊行为;MSG_DONTROUTE 表

  示传输层不要将它发出的包路由出去;MSG_OOB 表示数据应该被带外发送。

  如果发送成功,则返回发送的字节数,如果失败则返回SOCKET_ERROR。

  2.数据接收

  数据接收通过函数recv()实现,其原型如下:

  int recv(SOCKET s, const char FAR *buf, int len, int flags);

  各参数意义如下。

  ? s:准备接收数据的套接字。

  ? buf:指向即将接收数据的字符缓冲区的指针。

  ? len:缓冲区的大小。

  ? flags:指定传输控制方式,取值可为0、MSG_PKKE 和MSG_OOB,或者是这些取值

  进行按位或运算的结果。其中,0 表示无特殊行为;MSG_PKKE 表示把数据从接收端

  口复制到接收缓冲区中,并且没有从系统缓冲区中将数据删除;MSG_OOB 表示数据

  是带外发送的。

  如果接收成功,则返回接收的字节数,如果失败则返回SOCKET_ERROR。

  11.3 WinSock 类

  在上一节中简单介绍了直接利用WinSock API 进行网络传输的基本步骤以及主要函数的

  使用方法,而实际利用Visual C++ 6.0 开发网络应用程序的时候,很少直接利用这些API 进

  行编程,因为MFC 已经把这些API 都封装到MFC 提供的类中了。本节将详细介绍在网络编

  程中经常用到的MFC 提供的两个类,即CAsyncSocket 类和CSocket 类。它们的继承关系如

  图11-1 所示。

  图11-1 CAsyncSocket 类和CSocket 类的继承关系

  11.3.1 CAsyncSocket 类

  CAsyncSocket 类在很低的级别上封装了Windows Socket API,该类可以使程序员用面向

  对象的方法进行Socket 编程,而且可以非常方便地调用其他MFC 对象。这个类要求程序员

  对Socket 编程有较为深入的了解,要面对和在直接使用Windows Socket API 进行程序设计时

  一样的问题,如阻塞处理、网络字节顺序等。因为CAsyncSocket 类几乎是一一对应地封装了

  Windows Socket API,因此具有直接调用WinSock API 的灵活xìng。

  要使用一个CAsyncSocket 对象,则先调用它的构造函数,然后调用Create()函数,以创

  建一个套接字句柄(SOCKET 类型)。CAsyncSocket 对象既可以在栈中,也可以在堆中。对

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·286·

  于一个服务器套接字调用Listen()成员函数进行jiān tīng,对于一个客户套接字调用Connect()成

  员函数来请求连接。在接收一个连接请求时,服务器套接字应该调用一个Accept()函数来接

  收连接请求。完成之后,如果CAsyncSocket 对象在栈中构造,则当对象超出范围时,会自动

  调用析构函数;如果是在堆上被创建的,必须调用delete 来删除此对象。

  CAsyncSocket 类的主要成员函数如表11-3 所示。

  表11-3 CAsyncSocket 类主要成员函数及说明

  函数 说明

  CAsyncSocket 构造函数

  Create 创建一个Socket

  Attach 对CAsyncSocket 对象附加套接字句柄

  Detach 从CasyncSocket 对象除去套接字句柄

  FromHandle 返回CasyncSocket 对象的指针,给出套接字句柄

  GetLastError 获得上一次运行失败的状态

  GetPeerNcom 获得与套接字连接的对等套接字的地址

  GetSockNcom 获得套接字的本地名

  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,它可以发送数据

  除了上面的成员函数,CAsyncSocket 类还有一个数据成员m_hSocket,它是一个SOCKET

  句柄,记录了CAsyncSocket 类上附加的套接字。

  11.3.2 CSocket 类

  CSocket 类是CAsyncSocket 类的派生类,它最大的特点是提供了可以同CArchive 和

  CSocketFile 这两个类协同工作的接口。其中CArchive 类是一个存档类,它是将用户的数据

  保存为永久xìng存储对象的一种技术,在此它是用于同CSocketFile 类相关联而提供数据传输文

  件化的一种技术。而CSocketFile 类是一种特殊的文件对象,常用它来通过套接字进行数据的

  传递,它所提供的接口同普通文件类的接口基本上是一致的。也就是说,用户在使用CSocket

  类的时候,不必再像使用CAsyncSocket 类时不得不面对一大堆繁琐的工作,而只需像读写一

  枫叶文学网www.fywxw.com

  第11 章 网络编程

  ·287·

  般文件一样直接进行数据的读取就可以了。本章主要讲述网络编程,因此本小节主要介绍

  CSocket 类,而CArchive 类和CSocketFile 类的相关信息请读者自行查阅相关资料。

  1.CArchive 对象与串行化技术

  CArchive 对象是MFC 中专门帮助程序员处理归档对象的类,它最主要的作用就是把内

  存中的数据保存到永久存储介质中,这样程序员就不必担心使用的到底是套接字还是文件了。

  而为了实现CArchive 与CSocket 之间的连接,必须使用CSocketFile 作为中间的转化媒质。

  在实际工作中CSocketFile 对象负责连接到一个CSocket 对象,而CArchive 对象负责管理缓

  冲区。当发送归档对象的缓冲区被填满时,相关的CSocketFile 对象会将缓冲区的内容取出,

  并清空与套接字相关的归档缓冲区。当接收归档对象的缓冲区被填满时,CSocketFile 对象将

  停止读出直到缓冲区可用。

  2.用CSocket 类的编程步骤

  用CSocket 类进行网络编程的基本步骤如下。

  ? 构造服务器和客户机套接字对象。

  ? 调用Create()函数创建套接字。

  ? 服务器调用Listen()函数jiān tīng客户机的连接请求;客户机调用Connect()函数向服务器

  发出连接请求。

  ? 服务器jiān tīng到客户机的连接请求时,先创建一个新的套接字,然后调用Accept()函数

  接收客户机的连接请求。

  ? 服务器和客户机的套接字对象分别建立一个与之联系的CSocketFile 对象。

  ? 服务器和客户机的套接字对象分别创建一个与CSocketFile 相联系的CArchive 对象,

  以便进行数据传输。

  ? 使用CArchive 对象在服务器和客户机套接字之间进行数据传输。

  ? 当任务完成后,销毁CArchive、CSocketFile 和CSocket 对象。

  注意:由于CArchive 对象只能单向传送数据,所以在实际使用的时候必须定义两个CArchive 对

  象,分别用于数据的发送和接收。

  3.CSocket 类的主要成员函数

  CSocket 类是从CAsyncSocket 类继承来的,除了CAsyncSocket 类的成员函数,CSocket

  类还主要有以下成员函数,如表11-4 所示。

  表11-4 CSocket 类主要成员函数及说明

  函数 说明

  CSocket 构造一个CSocket 对象

  Create 创建一个Socket

  IsBlocking 确定

  松语文学免费小说阅读_www.16sy.com