MFC之CAsyncSocket详解

客户端套接字对象请求链接到服务器套接字对象

使用流式套接字需要事先建立客户端和服务器之间的连接,然后才能进行数据传输。在服务器套接字对象已经进入监听状态之后,客户端应用程序可以调用CAsyncSocket类的Connect向服务器发出一个连接请求,如果服务器接收了这个连接请求,两端的链接请求就建立了起来,否则,该成员函数将返回FALSE

CAsyncSocket::Connect函数原型如下

C++
BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort);
BOOL Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen );

lpszHostAddress表示主机名为ASCII格式的字符串,指定所要连接的服务器套接字的网络地址,可以是主机域名,如www.gymsaga.com也可以是十进制的IP地址,如192.168.1.2

nHostPort指定所要链接的服务器套接字的端口号

lpSockAddr是一个指向SOCKADDR结构变量的指针,该结构中包含了索要链接的服务器套接字的地址,包括主机名和端口号等信息

nSockAddrLen 给出lpSockAddr结构变量中地址的长度

返回值:如果返回TRUE,说明当客户机程序调用次成员函数发出链接请求后,服务器接收了请求,函数调用成功,连接已经建立,否则,返回FALSE,调用发生了错误,或者服务器不能立即响应,函数就返回,这时,可以调用GetLastError获取具体的错误代码

如果调用成功或者发生了WSAEWOULDBLOCK错误,当调用结束返回时,都会发生FD_CONNECT事件,MFC框架会自动调用客户端套接字的OnConncet事件处理函数,并将错误代码作为参数传给它。

服务器接收客户端的连接请求

在服务器端,使用CAsyncSocket流失套接字对象,一般按照以下步骤来接受客户端套接字对象的连接请求

1.服务器应用程序必须首先创建一个CAsyncSocket流式套接字,并调用它的Create成员函数创建底层套接字句柄。这个套接字对象专门用来监听来自客户端的链接请求,所以称他为监听套接字对象

2.调用监听淘金诶自对象Listen函数,使监听套接字对象开始监听来自客户端的连接请求

函数原型如下:

C++
BOOL Listen( int nConnectionBacklog = 5 );

参数nConnectionBacklog 指定了监听套接字对象等待队列中最大的待决链接请求个数,取值范围1~5,默认值为5

调用这个函数来启动对于到来的链接请求的监听,启动后,监听淘金诶自处于被动状态,如果有链接请求的到来,就被确认,并将他接纳到监听套接字对象的等待队列中,排队待决,如果参数nConnectionBacklog 的值大于1,等待队列缓冲区就有多个位置,监听套接字就可以同时确认接纳多个链接请求,但是如果链接请求到来时,等待队列已满,这个链接请求被拒绝,客户端套接字对象将收到一个WSAECONNREFUSED错误码。已排在等待队列中的待决链接请求,由随后调用的Accept函数接收。接收一个,等待队列就腾空一个位置,又可以确认接纳新来的连接请求。因此,监听套接字的等待队列是不断的动态变化的。Listen函数仅对面向连接的流失套接字对象有效,一般用在服务器端。

当Listen函数确认并接纳了一个来自客户端的链接请求后,会触发FD_ACCEPT事件,监听套接字会收到通知,表示监听套接字已经接纳了一个客户机的链接请求,MFC框架会自动调用监听套接字的OnAccept事件处理函数

3.创建一个新的空的套接字对象,不需要使用他的Create函数来创建底层的套接字句柄,这个套接字专门用来于客户端连接,并进行数据的传输,一般称他为链接套接字,并作为参数传递下一步的Accept函数

4.调用监听套接字对象的Accept函数,函数原型如下:

C++
virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpScokAddrLen = NULL);

rConnectedSocket是一个服务器端新的空的CAsyncSocket对象,专门来和客户端套接字建立连接并交换数据,就是上一步创建的链接套接字对象,必须在调用Accept函数之前创建,但不需要调用他的Create函数来构建该对象的底层套接字句柄,在Accept函数的执行过程中,会自动创建,并绑定到此对象

lpSockAddr :SOCKADDR结构的指针,它接收连接套接字的地址,就象在网络中已知的那样。当套接字被创建时,建立的地址体系确定lpSockAddr参数的格式。如果lpSockAddr和/或lpSockAddrLen等于NULL,则没有接受套接字的远程地址的信息返回。

lpSockAddrLen指向lpSockAddr中地址的字节长度的指针。lpSockAddr是返回值型参数:初始时,它应该包括通过lpSockAddr指向的一些空间;返回时,它应该包括返回地址的实际字节长度。

调用服务器端的监听套接字对象的Accept函数来接收一个客户端套接字对象的链接请求,函数的执行过程是:首先从监听套接字的待决连接队列中取出第一个连接请求,然后使用与监听套接字相同的属性创建一个新的底层套接字,将它绑定在rConnectedSocket参数的套接字对象上,并用它与客户端建立连接。如果调用此函数时队列中没有待决的连接请求,函数Accept就立即返回,返回值为0,调用GetLastError可以返回一个错误码

rConnectedSocket的套接字对象不能用来接收更多的连接,仅用来和连接的客户端套接字对象交换数据。而原来的监听套接字仍然保持打开和监听的状态,lpSockAddr 参数是一个返回结果的参数,他被填以请求链接的套接字的地址。Accept仅用于面向连接的流式套接字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值