为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

配置CSocket 操作的超时时间

2017-10-09 11页 doc 33KB 46阅读

用户头像

is_260251

暂无简介

举报
配置CSocket 操作的超时时间配置CSocket 操作的超时时间 配置 CSocket 操作的超时时间 配置 Csocket 操作的超时时间 最后修改 : 2005 年 8 月 24 日 本文的发布号曾为 CHS138692 转载自 blogjava/weidagang2046/articles/79285.html BOOL SetTimeOutUINT uTimeOut BOOL KillTimeOut BOOL OnMessagePending 示例代码 参考 概要 CSocket 操作,如“接 收”Receive、“发送”Send 和“连接”...
配置CSocket 操作的超时时间
配置CSocket 操作的超时时间 配置 CSocket 操作的超时时间 配置 Csocket 操作的超时时间 最后修改 : 2005 年 8 月 24 日 本文的发布号曾为 CHS138692 转载自 blogjava/weidagang2046/articles/79285.html BOOL SetTimeOutUINT uTimeOut BOOL KillTimeOut BOOL OnMessagePending 示例代码 参考 概要 CSocket 操作,如“接 收”Receive、“发送”Send 和“连接”Connect 均是阻塞操作,即要等到操作成功执行 完毕或套接字上出现错误后,对这些函数的调用才有返回结果。 在某些情况下,操 作可能永远不能成功完成,这将导致程序无限循环等待操作完成。一种解决方法是 通过编程限制完成操作使用的时间。本文将讨论这种方法。 这种方法是设置定时, 让它在操作时间过长时启动。此方法的关键在于处理定时器的方式。虽然操作是“阻 塞的”,但仍然可以处理到达的消息。如果通过使用 SetTimer 设置定时器,那么可 以查找 WM_TIMER 消息,并在收到该消息时终止操作。该过程中涉及的主要函数 有: Windows API 调用函数: ::SetTimer MFC 函数: CSocket::OnMessagePending CSocket::CancelBlockingCall 为简单起见,可以在 Csocket 衍生类中封装该功能。 警告:在进一步阅读本文之前,请注意在某些 MFC 版本中存在错误,会在试图使 用定时器并重叠 OnMessagePending 时引起问题。这一问题将在下面的 Microsoft KnowledgeBase 文章中进行讨论: 137632 support.microsoft/kb/137632/EN-US/ 错 误:定时器激活时未调用OnMessagePending 本文仅适用于 Visual C 的 1.52、 1.52b、2.1 和 2.2 版本。如果使用的是这些Visual C 版本之一,则还需要实施所提 供的变通解决方法。 本文最后部分显示提供这种超时功能的类的示例代码。以下内 容讲述由该类实现的函数。 BOOL SetTimeOutUINT uTimeOut 调用此函数之后紧 接着调用 CSocket 函数(如 Receive、Send 和 Accept)。uTimeOut 参数是以毫 秒为单位指定的。之后,进行定时器的设置。如果设置定时器失败,那么函数返回 FALSE。有关详细情况,请参阅 SetTimer 函数的 Windows API 文档。 BOOL KillTimeOut 在完成阻塞操作后,必须调用此函数。此函数删除用 SetTimeOut 设 置的定时器。如果调用 KillTimer 失败,则返回 FALSE。有关详细情况,请参阅 KillTimer 函数的Windows API 文档。 BOOL OnMessagePending这是一个虚拟回调 函数,在等待操作完成时由 CSocket 类进行调用。此函数给您提供处理传入消息的 机会。此实施过程检查用 SetTimeOut 调用函数设置的定时器的 WM_TIMER 消 息。如果收到消息,则调用 CancelBlockingCall 函数。有关 OnMessagePending 和 CancelBlockingCall 函数详细的信息,请参阅 MFC 文档。请注意:调用 CancelBlockingCall 函数 将导致操作失败,而且 GetLastError 函数返回 WSAEINTR(表示操作中断)。 下面是使用该类的一个例子: ... CTimeOutSocket sockServer CAcceptedSocket sockAccept sockServer.Create777 sockServer.Listen// Note the following sequence:// SetTimeOut//// KillTimeOutifsockServer.SetTimeOut10000ASSERTFALSE// Error Handling...for some reason we could not setup// the timer.ifsockServer.AcceptsockAcceptint nError GetLastErrorifnErrorWSAEINTRAfxMessageBoxquotNo Connections Arrived For 10 Secondsquotelse // Do other error processing.ifsockServer.KillTimeOutASSERTFALSE// Error Handling...for some reason the timer could not// be destroyed...perhaps a memory overwrite has changed// m_nTimerID//...//// HEADER FILE//class CTimeOutSocket : public CSocketpublic:BOOL SetTimeOutUINT uTimeOutBOOL KillTimeOutprotected:virtual BOOL OnMessagePendingprivate:int m_nTimerID//// END OF FILE////// IMPLEMENTATION FILE//BOOL CTimeOutSocket::OnMessagePendingMSG msgif::PeekMessageampmsg NULL WM_TIMER WM_TIMER PM_NOREMOVEif msg.wParam UINT m_nTimerID// Remove the message and call CancelBlockingCall.::PeekMessageampmsg NULL WM_TIMER WM_TIMER PM_REMOVECancelBlockingCallreturn FALSE // No need for idle time processing.return CSocket::OnMessagePendingBOOL CTimeOutSocket::SetTimeOutUINT uTimeOutm_nTimerID SetTimerNULL0uTimeOutNULLreturn m_nTimerIDBOOL CTimeOutSocket::KillTimeOutreturn KillTimerNULLm_nTimerID CSOCKET 的超时 设置和 UDP 发送接收 使用 CSoket 多次了,但对于它的 block 模式的理解并不 udp 多发测试server 接到数据后,需要通过某种方式是很深入。昨天使用 csoket 的 将数据发送到 client使用 tcp 方式比较可靠,我一直这样用的,但是比较费时,需 要逐一发送,发现了问题: 1)createsendtoreceivefrom.... 2)其中,发送方一直定 时发送数据无问题; 3)而接收方,通过一个单独的接收线程实现 注意:csocket 不 能跨线程使用~主线程中 socket create后,detach并将 sock 作为 lpvoid 传入接收 线程 。代码如下: //处理接收数据 UINT CSockSvr::DealSvrRevDataLPVOID lParam ...... DWORD dwError TCHAR cBuff1000 CString sIP UINT uPort forpDlg-gtm_bExit ::memset cBuff0sizeofcBuff // 如果没有接到数据,一直等 待。。。。 // 阻塞模式的弊端:::在退出时候,通过 CancelBlockingCall int iRstSockSvr.ReceiveFrom cBuffsizeofcBuffsIPuPort0 if iRstSOCKET_ERROR CString sTempcBuff TRACE1 _Tquotrn Rev Data: srnquotsTemp else dwErrorGetLastError TRACE1 _Tquotrn Rev Data Error code: drnquotdwError ::Sleep200 return 0 问题:如果发送方没有数据, SockSvr.ReceiveFrom会一致处于等待状态,导致整个处理接收线程的停止,如果用 户需要退出/结束程序,无法正确释放资源(无法关闭在线程函数重打开的 socket-- 不能跨线程操作 socket,无法关闭线程,造成系统 memoryleak... 针对这种问题, 微软的解决是:support.microsoft/default.aspxscidkbzh-cn138692 ,经过测试, 在 socket 进行 connect的时候不好用。后来,结合微软的办法,我通过自定义的定 时器,实现了 block 超时间后自动退出的功能〉 if definedAFX_TIMEOUTSOCK_H__19897A81_4EAF_4005_91FD_DC3047725139__INCLUDED_ define AFX_TIMEOUTSOCK_H__19897A81_4EAF_4005_91FD_DC3047725139__INCLUDED_ if _MSC_VER gt 1000 pragma once endif // _MSC_VER gt 1000// TimeOutSock.h : header file // / CSocket 操作,如接收Receive、发送Send 和连接Connect 均是阻塞操 作, 即要等到操作成功执行完毕或套接字上出现错误后,对这些函数的调用才有返 回结果。某些情况下,操作可能永远不能成功完成,这将导致程序无限循环等待操 作完成。 一种解决方法是通过编程限制完成操作使用的时间。本文将讨论这种方法。 / ///////////////////////////////////////////////////////////////////////////// // CTimeOutSock command target class CTimeOutSock : public CSocket // Attributes public: // Operations public: CTimeOutSock virtual CTimeOutSock // Overrides public: // ClassWizard generated virtual function overrides //AFX_VIRTUALCTimeOutSock public: virtual BOOL OnMessagePending //AFX_VIRTUAL // Generated message map functions //AFX_MSGCTimeOutSock // NOTE - the ClassWizard will add and remove member functions here. //AFX_MSG / //定时器设置 block 超时 不是很好用。。。徐卫话 2006.4.19 CSocket 操作,如接收Receive、发送Send 和连接Connect 均是阻塞操作, 即要等到操作成功执行完毕或套接字上出现错误后,对这些函数的调用才有返回结 果。某些情况下,操作可能永远不能成功完成,这将导致程序无限循环等待操作完 成。 一种解决方法是通过编程限制完成操作使用的时间。本文将讨论这种方法。 / // 自己计算时间的办法 OK public: BOOL SetTimeOutUINT uTimeOut1000 BOOL KillTimeOut private: LONGLONG m_llDtStartUINT m_uTimeOut ///////////////////////////////////////////////////////////////////////////// // // Microsoft Visual C will insert additional declarations immediatelybefore the previous line. endif// definedAFX_TIMEOUTSOCK_H__19897A81_4EAF_4005_91FD_DC3047725139__INCLUDED_ // TimeOutSock.cpp : implementation file // include quotstdafx.hquot include quotNetBroad.hquot include quotTimeOutSock.hquot ifdef _DEBUG define new DEBUG_NEW undef THIS_FILE static char THIS_FILE __FILE__ endif ///////////////////////////////////////////////////////////////////////////// // CTimeOutSock CTimeOutSock::CTimeOutSock CTimeOutSock::CTimeOutSock // Do not edit the following lines which are needed by ClassWizard. if 0 BEGIN_MESSAGE_MAPCTimeOutSock CSocket //AFX_MSG_MAP END_MESSAGE_MAP endif // 0 ///////////////////////////////////////////////////////////////////////////// // CTimeOutSock member functions//设置超时BOOL CTimeOutSock::SetTimeOutUINT uTimeOut//get start cntLARGE_INTEGER llCnt::QueryPerformanceCounterampllCntm_llDtStartllCnt.QuadPartm_uTimeOutuTimeOutreturn TRUE//删除超时参数BOOL CTimeOutSock::KillTimeOutm_llDtStart0//表 明取消计时return TRUE//检查是否超时间BOOL CTimeOutSock::OnMessagePending// TODO: Add your specialized code here and/or call the base class/MSG msgif::PeekMessageampmsg NULL WM_TIMER WM_TIMER PM_NOREMOVE if msg.wParam UINT m_nTimerID // Remove the message and call CancelBlockingCall. ::PeekMessageampmsg NULL WM_TIMER WM_TIMER PM_REMOVECancelBlockingCall return FALSE // No need for idle time processing. / if m_llDtStart LARGE_INTEGER lldtEnd ::QueryPerformanceCounteramplldtEnd LARGE_INTEGER llFrq ::QueryPerformanceFrequencyampllFrq double dbDealydoublelldtEnd.QuadPart-m_llDtStart1000/llFrq.QuadPartif dbDealygtm_uTimeOut CancelBlockingCall return FALSE // No need for idle time processing. return CSocket::OnMessagePending 经过改进后, 对处理接收线成的 函数进行了部分改进: SockSvr.SetTimeOut500 intiRstSockSvr.ReceiveFrom cBuffsizeofcBuffsIPuPort0 SockSvr.KillTimeOut 当 block 超过定时后,socket 自动 退出 block,防止接收线程停止。问题终于解决了~ from: arm8/cv/1/6/197.html-sWgK4ymQ K aE-sWgK 4ymQaE-sWg 4znRbFtXhL 5znR L bFtXhL 5znRbFtXh 5znRbFtXhL 5znS M cG0uYiM 6AampoScG0uYi 6AampoScG0uYiM 6AampoScG0uYiM 6AampoScH1vZjN7BpTdH1vZjN 7BpTdH1vZjN 7BpTdH1vZjN7BpTdH1vkO 8CqUeI2wkO 8CqUeI2wkO8CqUeI2wkO 8CqUeI2wkP 9DrVfJ3xlP9DrVfJ3xlP 9DrVfJ3xlP 9DrVfJ3xlP9D-sWgK4ymQ aE-sWgK4ymQ aE-sWgK4ymQaE-sWgK4ymQ aE-sXhL5znR bFtXhL5znRbFtXhL5znR bFtX S hL5znR bFtXhL6Aampo cG0uYiM6AampoS cG0uYiM6AampoS cG0uYiM6Aampo cG0uYiM6ApT dH1vZ S T jN7BpT dH1vZjN7Bp dH1vZjN7BpT dH1vZjN7BpT eI2wk O8CqUeI2wkO8Cq UeI2wkO8Cq UeI2wkO8CqUeI3xlP9Dr VfJ3xlP9Dr VfJ3xlP9DrVfJ3xlP9Dr VfJ3xmQaE-s WgK4ymQaE-s WgK4ymQaE-s WgK4ymQaE-s WgK4ymQbFtXhL5znRbFt XhL5znRbFt XhL5znRbFtXhL5znRbFu YiM6AampoScG0u YiM6AampoScG0uYiM6AampoScG0u YiM6Aamp oScG0u YjN7BpTdH1vZjN7BpTdH1v ZjN7Bp TdH1v ZjN7BpTdH1vZjN7CqUeI2w kO8CqUeI2w kO8CqUeI2wkO8CqUeI2w kO8CrVfJ3x lP9DrVfJ3xlP9DrVfJ3x lP9DrVfJ3x lP9DrVgK4ymQaE-sWgK4y mQaE-sWgK4y mQaE-sWgK4ymQaE-sWgK4z nRbFtXhL5z nRbFtXhL5znRbFtXhL5z nRbFtXhL5zoScG0uYiM6 AampoScG0uYiM6 AampoScG0uYiM6 AampoScG0uYiM6 AampoScH1vZjN7 BpTdH1vZjN7 BpTdH1vZjN7 BpTdH1vZjN7 BpTdH1wkO8 CqUeI2wkO8 CqUeI2wkO8 CqUeI2wkO8 CqUeI2wkP9 DrVfJ3xlP9 DrVfJ3xlP9 DrVfJ3xlP9 DrVfJ3xlP9 E-sWgK4ymQa E-sWgK4ymQa E-sWgK4ymQa E-sWgK4ymQa E-sXhL5znRb FtXhL5znRb FtXhL5znRb FtXhL5znRb FtXhM6AampoSc G0uYiM6AampoSc G0uYiM6AampoSc G0uYiM6AampoSc G0uYiM6ApTd H1vZjN7BpTd H1vZjN7BpTd H1vZjN7BpTd H1vZjN7BpUe I2wkO8CqUe I2wkO8CqUe I2wkO8CqUe I2wkO8CqUe I3xlP9DrVf J3xlP9DrVf J3xlP 9DrVfJ3xlP9DrV fJ3xmQaE-sW gK4ymQaE-sW gK4ymQaE-sW gK4ymQaE-sWgK4ymQbFtXhL5 znRbFtXhL5znRbFtXhL5 znRbFtXhL5 znRbF0uYiM6AampoScG0uYiM6 AampoScG0uYiM6 AampoScG0uYiM6AampoScG0uYjN7 BpTdH1vZjN7 BpTdH1vZjN7BpTdH1vZjN7 BpTdH1vZjN8 CqUeI2wkO8CqUeI2wkO8 CqUeI2wkO8 CqUeI2wkO8CrVfJ3xlP9 DrVfJ3xlP9 DuYiM6AampoScG0uYiN7BpTd H1vZjN7BpTd H1vZjN7BpTdH1vZjN7BpTd H1vZjN7BqUe I2wkO8CqUeI2wkO8CqUe I2wkO8CqUe I2wkO8CqVfJ3xlP9DrVf J3xl f P9DrVf J3xlP9DrV J3xlP9DrVf J4ym g QaE-sWg K4ymQaE-sW K4ymQaE-sWg K4ymQaE-sWg K4ynRbFtXhL5znRbFtXh L5znRbFtXh L5znR bFtXhL5znRcG0uY iM6AampoScG0uY iM6AampoScG0uYiM6AampoScG0uY iM6AampoScG1vZ jN7BpTdH1vZjN7BpTdH1vZ jN7BpTdH1vZ jN7BpTdH1v kO8CqUeI2w kO8CqUeI2w kO8CqUeI2wkO8CqUeI2w kO9DrVfJ3x lP9DrVfJ3xlP9DrVfJ3x lP9DrVfJ3x lP9D-sWgK4y mQaE-sWgK4y mQaE-sWgK4y mQaE-sWgK4y mQaE-sWhL5z nRbFtXhL5z nRbFtXhL5znRbFtXhL5z nRbFtXhL6Aamp oScG0uYiM6AampoScG0uYiM6Aamp oScG0uYiM6Aamp oScG0uYiM6AamdH1vZjN7B pTdH1vZjN7B pTdH1vZjN7BpTdH1vZjN7B pTeI2wkO8C qUeI2wkO8CqUeI2wkO8C qUeI2wkO8C qUeI2xlP9DrVfJ3xlP9D rVfJ3xlP9DrVfJ3xlP9D rVfJ3xmQaE -sWgK4ymQaE -sWgK4ymQaE -sWgK4ymQaE -sWgK4ymQaF tXhL5znRbF tXhL5znRbF tXhL5znRbF tXhL5znRbF uYiM6AampoScG 0uYiM6AampoScG 0uYiM6AampoScG 0uYiM6AampoScG 0uYiN7BpTdH 1vZjN7BpTdH 1vZjN7BpTdH 1vZjN7BpTdH 1vZjN7CqUeI 2wkO8CqUeI 2wkO8CqUeI 2wkO8CqUeI 2wkO8CqVfJ 3xlP9DrVfJ 3xlP9DrVfJ 3xlP9DrVfJ 3xlP9DrVfK 4ymQaE-sWgK 4ymQaE-sWgK 4ymQaE-sWgK 4ymQaE-sWgK 4ynRbFtXhL 5znRbFtXhL 5znRbFtXhL 5znRbFtlP 9DrVfJ3xlP 9DrVfJ3xlP 9DrVfJ3xlP 9DrVfJ3ymQ aE-sWgK4ymQ aE-sWg K4ymQaE-sWgK4ym QaE-sWgK4ynRbFtXhL5 znRbFtXhL5znRbFtXhL5 znRbFtXhL5 znRbG0uYiM6AampoScG0uYiM6 AampoScG0uYiM6 AampoScG0uYiM6AampoScG0vZjN7 BpTdH1vZjN7 BpTdH1vZjN7BpTdH1vZjN7 BpTdH1vZjO8 CqUeI2wkO8CqUeI2wkO8 CqUeI2wkO8 CqUeI2wkO8DrVfJ3xlP9 DrVfJ3xlP9 DrVfJ3xlP9DrVfJ3xlP9 DrWgK4ymQa E-sWgK4ymQ E-sWgK4ymQa E-sWg a b K4ymQa E-sWgL5znR FtXhL5znRb FtXh b .
/
本文档为【配置CSocket 操作的超时时间】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索