b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

通信的同步和异步 socket API CSocket CAsy(3)

电脑杂谈  发布时间:2018-02-11 19:48:12  来源:网络整理

类似的,Send()如果返回WSAEWOULDBLOCK错误,我们在OnSend()处等待,Receive()如果返回WSAEWOULDBLOCK错误,我们在OnReceive()处等待,以此类推。

还有一点,也许是个难点,那就是在客户方调用Connect()连接服务方,那么服务方如何Accept(),以建立连接的问题。简单的做法就是在的Socket收到OnAccept()时,用一个新的CAsyncSocket对象去建立连接,例如:

void CMySocket::OnAccept( int ErrCode )

{

CMySocket* pSocket = new CMySocket;

Accept( *pSocket );

}

于是,上面的pSocket和客户方建立了连接,以后的通信就是这个pSocket对象去和客户方进行,而的Socket仍然继续在,一旦又有一个客户方要连接服务方,则上面的OnAccept()又会被调用一次。当然pSocket是和客户方通信的服务方,它不会触发OnAccept()事件,因为它不是Socket。

三、CSocket

CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类。它是如何又把CAsyncSocket变成同步的,而且还能响应同样的Socket事件呢?

其实很简单,CSocket在Connect()返回WSAEWOULDBLOCK错误时,不是在OnConnect(),OnReceive()这些事件终端函数里去等待。你先必须明白Socket事件是如何到达这些事件函数里的。这些事件处理函数是靠CSocketWnd窗口对象回调的,而窗口对象收到来自Socket的事件,又是靠线程消息队列分发过来的。通信的同步和异步总之,Socket事件首先是作为一个消息发给CSocketWnd窗口对象,这个消息肯定需要经过线程消息队列的分发,最终CSocketWnd窗口对象收到这些消息就调用相应的回调函数(OnConnect()等)。

所以,CSocket在调用Connect()之后,如果返回一个WSAEWOULDBLOCK错误时,它马上进入一个消息循环,就是从当前线程的消息队列里取关心的消息,如果取到了WM_PAINT消息,则刷新窗口,如果取到的是Socket发来的消息,则根据Socket是否有操作错误码,调用相应的回调函数(OnConnect()等)。

大致的简化代码为:

BOOL CSocket::Connect( ... )

{

if( !CAsyncSocket::Connect( ... ) )

{

if( WSAGetLastError() == WSAEWOULDBLOCK ) file://由于异步操作需要时间,不能立即完成,所以Socket返回这个错误

{

file://进入消息循环,以从线程消息队列里查看FD_CONNECT消息,直到收到FD_CONNECT消息,认为连接成功。

while( PumpMessages( FD_CONNECT ) );

}

}

同步 通信_异步通信方式_通信的同步和异步

}

BOOL CSocket::PumpMessages( UINT uEvent )

{

CWinThread* pThread = AfxGetThread();

while( bBlocking )file://bBlocking仅仅是一个标志,看用户是否取消对Connect()的调用

{

MSG msg;

if( PeekMessage( &msg, WM_SOCKET_NOTIFY ) )


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-72367-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 魏英烁
      魏英烁

      天王老子保护地也能炸个片甲不留

    每日福利
    热点图片
    拼命载入中...