CSocket关于连接和阻塞!!

基于阻塞发送和接收二进制数据。

比如可以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里的OnReceiveOnAccept消息处理函数,其原理分别是:

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成员函数取出。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值