基于阻塞发送和接收二进制数据。
比如可以Client端发送,Server端接收
Server端:m_recvive. Receive( void* lpBuf, int nBufLen, int nFlags = 0 );
Client端:m_client. Send( const void* lpBuf, int nBufLen, int nFlags = 0 );
接着再分析一下各个类中提到的常用方法的同步特性。
Listen(…):执行后不管有没有连接,立即返回。
Connect(…):如果服务器端有端口正在侦听,则立即成功返回,如果没有,则过几秒钟显示无法连接。
Accept(…):Listen函数返回后可以执行此函数,但是此函数是基于阻塞的,只要客户机connect连接并且端口正确,则立即成功返回,建立连接。如果迟迟侦测不到连接,则不断阻塞,直到连接成功或者强行关闭。
Send(…):调用后就将数据保存在socket缓冲区中,立即返回。
Receive(…):和Accept一样的阻塞,直到能从socket缓冲区成功读取到nBufLen长度的数据。
既然如此,应该会想到这样会产生两个问题:
1、 在侦听的时候,如果客户端迟迟没有连接,则侦听方执行到Accept则阻塞不能响应。
2、 在用Receive接收数据,如果迟迟得不到发送的数据,也阻塞不能响应。
带有这两个问题的软件显然是不能忍受的。
幸亏CSocket类里可以使用继承自CAsyncSocket里的OnReceive和OnAccept消息处理函数,其原理分别是:
1、 OnAccept():Listen过后,如果侦测到客户机有连接,则产生消息调用OnAccept(),一般可以在此函数里面调用Accept便可避免侦听时的阻塞。
virtual void OnAccept( int nErrorCode );
参数nErrorCode:套接字上最近的错误代码。此成员函数可用的错误代码有:
l 0:函数成功地执行并返回。
l WSAENETDOWN:Windows Sockets检测到网络系统故障。说明由框架调用,通知监听套接字现在可以调用Accept成员函数来接收挂起的连接请求(有connect请求进入)。
2、 OnReceive():建立连接后,如果侦测到Socket缓冲区里有数据到达,便自动调用OnReceive(),在此函数里面使用Receive接收就可避免接收数据的阻塞。
virtual void OnReceive( int nErrorCode );参数nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有:
l 0:函数成功地执行并返回。
l WSAENETDOWN:Windows Sockets检测到了网络故障。说明本函数由框架调用,通知套接字缓冲中有数据,可以调用Receive成员函数取出。