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

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

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

{

if( msg.message == WM_SOCKET_NOTIFY && WSAGETSELECTEVENT(msg.lParam) == uStopFlag )

{

CAsyncSocket::DoCallBack( msg.wParam, msg.lParam );

return TRUE;

}

}

else

{

OnMessagePending(); file://处理消息队列里的其它消息

pThread->OnIdle(-1);

}

}

}

BOOL CSocket::OnMessagePending()

{

MSG msg;

if( PeekMessage( &msg, NULL, WM_PAINT, WM_PAINT, PM_REMOVE ) )

{ file://这里仅关心WM_PAINT消息,以处理阻塞期间的主窗口重画

::DispatchMessage( &msg );

return FALSE;

}

return FALSE;

}

其它的CSocket函数,诸如Send(),Receive(),Accept()都在收到WSAEWOULDBLOCK错误时,进入PumpMessages()消息循环,这样一个原本异步的CAsyncSocket,到了派生类CSocket,就变成同步的了。

明白之后,我们可以对CSocket应用自如了。比如有些程序员将CSocket的操作放入一个线程,以实现多线程的异步Socket(通常,同步+多线程 相似于 异步 )。

四、CSocketFile

另外,进行Socket编程,还有一个经常要用到的类,那就是CSocketFile类,其实它并不是用来在Socket双方发送文件的,而是将需要序列化的数据,比如一些结构体数据,传给对方,这样,程序的CDocument()的序列化函数就完全可以和CSocketFile联系起来。例如你有一个CMyDocument实现了Serialize(),你可以这样来将你的文档数据传给Socket的另一方:

CSocketFile file( pSocket );

CArchive ar( &file, CArchive::store );

pDocument->Serialize( ar );

ar.Close();

同样,接收一方可以只改变上面的代码为CArchive ar( &file, CArchive::load );即可。

注意到,CSocketFile类虽然从CFile派生,但它屏蔽掉了CFile::Open()等函数,而函数里仅扔出一个例外。那么也就是说,你不能调用CSocketFile的Open函数来打开一个实实在在的文件,否则会导致例外,如果你需要利用CSocketFile来传送文件,你必须提供CSocketFile类的这些函数的实现。

再一点,CArchive不支持在datagram的Socket连接上序列化数,我们要注意。


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

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

    • 张双燕
      张双燕

      一天内所有软件闪退了两次

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