为CSocket配置Time-Out功能
发布者:tomore 发布日期:2006-08-31 11:59
| 为CSocket配置Time-Out功能 |
|---|
| CSocket操作,如Send(),Receive(),Connect()都属阻塞操作,即它们在成功完成或错误发生之前是不会返回的。 在某些情况下,某项操作可能永远不能成功完成,程序为了等待其完成就得永远循环下去。在程序中为某项操作限定一个成功完成的时间是个好主意。本文就是讨论此问题的。 一个办法是设计一个计时器,当操作费时过长时就触发。这个办法的关键是怎样处理计时器。虽然操作是\"阻塞\"的,但仍具处理传回的消息的能力。如果用SetTimer来设置计时器,就可截获WM_TIMER消息,当它产生时就终止操作。涉及到这个过程的主要函数是:Windows API ::SetTimer(),MFC函数CSocket::OnMessagePending()和CSocket:: CancelBlockingCall()。这些功能可包装到你的CSocket类中得以简化。 类中用到三个重要函数: BOOL SetTimeOut(UINT uTimeOut) 它应在CSocket函数调用前被调用。uTimeOut以千分秒为单位。下面的实现只是简单的设置计时器。当设置计时器失败时返回False。参见Windows API中关于SetTimer的说明。 BOOL KillTimeOut() 此函数应在操作未完成被阻塞时被调用。它删除SetTimeOut所设置的计时器。如果调用KillTimer失败则返回False。参见Windows API中关于KillTimer的说明。 BOOL OnMessagePending() 它是一个虚拟回调函数,当等待操作完成时被CSocket类调用。它给你机会来处理传回的消息。这次我们用它来检查SetTimeOut所设置的计时器,如果超时(Time-Out),则它调用CancelBlockingCall()。参见MFC文档关于OnMessagePending()和CancelBlockingCall()的说明。注意调用CancelBlockingCall()将使当前操作失败,GetLastError()函数返回WSAEINTR(指出是中断操作)。 下面就是使用这个类的例子: ...\r\n CTimeOutSocket sockServer;\r\n CAcceptedSocket sockAccept;\r\n\r\n sockServer.Create(777);\r\n sockServer.Listen();\r\n\r\n // Note the following sequence:\r\n // SetTimeOut\r\n // <operation which might block>\r\n // KillTimeOut\r\n\r\n if(!sockServer.SetTimeOut(10000))\r\n {\r\n ASSERT(FALSE);\r\n // Error Handling...for some reason, we could not setup\r\n // the timer.\r\n }\r\n\r\n if(!sockServer.Accept(sockAccept))\r\n {\r\n int nError = GetLastError();\r\n if(nError==WSAEINTR)\r\n AfxMessageBox(\"No Connections Arrived For 10 Seconds\");\r\n else\r\n ; // Do other error processing.\r\n }\r\n\r\n if(!sockServer.KillTimeOut())\r\n {\r\n ASSERT(FALSE);\r\n // Error Handling...for some reason the timer could not\r\n // be destroyed...perhaps a memory overwrite has changed\r\n // m_nTimerID?\r\n // \r\n }\r\n ...\r\n\r\n\r\n下面是示例代码: // \r\n // HEADER FILE\r\n // \r\n class CTimeOutSocket : public CSocket\r\n {\r\n public:\r\n BOOL SetTimeOut(UINT uTimeOut);\r\n BOOL KillTimeOut();\r\n protected:\r\n virtual BOOL OnMessagePending();\r\n private:\r\n int m_nTimerID;\r\n };\r\n // \r\n // END OF FILE\r\n // \r\n\r\n // \r\n // IMPLEMENTATION FILE\r\n // \r\n BOOL CTimeOutSocket::OnMessagePending()\r\n {\r\n MSG msg;\r\n if(::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_NOREMOVE))\r\n {\r\n if (msg.wParam == (UINT) m_nTimerID)\r\n {\r\n // Remove the message and call CancelBlockingCall.\r\n ::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE);\r\n CancelBlockingCall();\r\n return FALSE; // No need for idle time processing.\r\n };\r\n };\r\n\r\n return CSocket::OnMessagePending();\r\n }\r\n\r\n BOOL CTimeOutSocket::SetTimeOut(UINT uTimeOut)\r\n {\r\n m_nTimerID = SetTimer(NULL,0,uTimeOut,NULL);\r\n return m_nTimerID;\r\n }\r\n\r\n BOOL CTimeOutSocket::KillTimeOut()\r\n {\r\n return KillTimer(NULL,m_nTimerID);\r\n }\r\n |
上一篇:多屏幕显示器编程( 七 )
相关下载资源
这才是最好用的OutLookBar--mxOutlookBarPro
IrfanView -- 外挂功能包
WIN32音频数据采集---WaveIn-Out实现
js-按钮点击后变为不可点击状态,防止多次提交
Snort-output xml plugin实践
Snort-output xml plugin分析
[MSNews]Hotmail-Outlook/OutlookExpress的POP3连接要收费了
关于这才是最好用的OutLookBar--mxOutlookBarPro回复如下
python编程-将Python程序转化为可执行程序
更多“为CSocket配置Time-Out功能”相关内容....
会员评论: [举报]
还没有会员发布评论
发表评论: [用户登录]xunzhaooa:通过支付宝支付,获得100金币
andy13720:通过支付宝支付,获得100金币
wy6543210:通过支付宝支付,获得100金币
cooper_test:通过支付宝支付,获得100金币
mbisjk:上传资源被审核通过,获得2金币
308308wt2:上传资源被审核通过,获得2金币
cai0904@163.com:上传资源被审核通过,获得2金币
xlzcimos:上传资源被审核通过,获得2金币
qyduyang:上传资源被审核通过,获得2金币
xlzcimos:上传资源被审核通过,获得2金币
andy13720:通过支付宝支付,获得100金币
wy6543210:通过支付宝支付,获得100金币
cooper_test:通过支付宝支付,获得100金币
mbisjk:上传资源被审核通过,获得2金币
308308wt2:上传资源被审核通过,获得2金币
cai0904@163.com:上传资源被审核通过,获得2金币
xlzcimos:上传资源被审核通过,获得2金币
qyduyang:上传资源被审核通过,获得2金币
xlzcimos:上传资源被审核通过,获得2金币

