按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
o addrlen :addr 参数的长度。
如果成功,则返回一个新的套接字,它对应于已经接受的那个客户机连接。对于该客户
机所有的后续操作,都使用这个新的套接字。原来的套接字则仍处于监听模式,继续接受其
他客户机的连接。如果失败,则返回 INVALID_SOCKET 。
11。2。5 监听 socket
对于服务器端来说,在它接受客户机的连接之前,首先要监听。只有进入了监听模式,
才能接受来自客户机的连接。这一点可以通过 listen()函数实现,它的原型如下:
int listen(SOCKET s; int backlog);
各参数意义如下。
o s:进行监听的套接字。
o 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 );
各参数意义如下。
o s:已经建立连接的套接字。
o buf :字符缓冲区,区内包含即将发送的数据。
o len :缓冲区内的字符数目。
o flags:指定数据传输方式,取值可为 0、MSG_DONTROUTE 和 MSG_OOB ,或者是
·284 ·
…………………………………………………………Page 296……………………………………………………………
第 11 章 网络编程
这些取值进行按位或运算的结果。其中,0 表示无特殊行为;MSG_DONTROUTE 表
示传输层不要将它发出的包路由出去;MSG_OOB 表示数据应该被带外发送。
如果发送成功,则返回发送的字节数,如果失败则返回 SOCKET_ERROR。
2 .数据接收
数据接收通过函数 recv()实现,其原型如下:
int recv(SOCKET s; const char FAR *buf; int len; int flags );
各参数意义如下。
o s:准备接收数据的套接字。
o buf :指向即将接收数据的字符缓冲区的指针。
o len :缓冲区的大小。
o 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 的灵活性。
要使用一个 CAsyncSocket 对象,则先调用它的构造函数,然后调用 Create()函数,以创
建一个套接字句柄(SOCKET 类型)。CAsyncSocket 对象既可以在栈中,也可以在堆中。对
·285 ·
…………………………………………………………Page 297……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
于一个服务器套接字调用 Listen()成员函数进行监听,对于一个客户套接字调用 Connect()成
员函数来请求连接。在接收一个连接请求时,服务器套接字应该调用一个 Accept() 函数来接
收连接请求。完成之后,如果 CAsyncSocket 对象在栈中构造,则当对象超出范围时,会自动
调用析构函数;如果是在堆上被创建的,必须调用 delete 来删除此对象。
CAsyncSocket 类的主要成员函数如表 11…3 所示。
表 11…3 CAsyncSocket 类主要成员函数及说明
函数 说明
CAsyncSocket 构造函数
Create 创建一个 Socket
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,它可以发送数据
除了上面的成员函数,CAsyncSocket 类还有一个数据成员 m_hSocket ,它是一个 SOCKET
句柄,记录了 CAsyncSocket 类上附加的套接字。
11。3。2 CSocket 类
CSocket 类是 CAsyncSocket 类的派生类,它最大的特点是提供了可以同 CArchive 和
CSocketFile 这两个类协同工作的接口。其中