您的位置:首页 > 其它

MFC CSocket正确设置接收和发送超时

2013-07-10 12:04 543 查看
CSocket超时设置经过测试,只有这样才能有用。

原理:OnMessagePending是CSocket类的消息处理函数,我们重载这个虚函数,就能处理所有的CSokcet消息,类似PreTranslateMessage函数。

自己由CSocket派生一个类,类名自己定。

class CTimeOutSock : public CSocket

{

// Attributes

public:

BOOL SetTimeOut(UINT uTimeOut=1000);

BOOL KillTimeOut();

private:

LONGLONG m_llDtStart;

UINT m_uTimeOut;

public:

// Operations

public:

CTimeOutSock();

virtual ~CTimeOutSock();

// Overrides

public:

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CTimeOutSock)

public:

virtual BOOL OnMessagePending();

//}}AFX_VIRTUAL

// Generated message map functions

//{{AFX_MSG(CTimeOutSock)

// NOTE - the ClassWizard will add and remove member functions here.

//}}AFX_MSG

};

//然后是cpp文件

#include "stdafx.h"

#include "TimeOutSock.h"

#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_MAP(CTimeOutSock, CSocket)

//}AFX_MSG_MAP

END_MESSAGE_MAP()

#endif // 0

/////////////////////////////////////////////////////////////////////////////

// CTimeOutSock member functions

//设置超时

BOOL CTimeOutSock::SetTimeOut(UINT uTimeOut)

{

//get start cnt

LARGE_INTEGER llCnt;

::QueryPerformanceCounter(&llCnt);

m_llDtStart=llCnt.QuadPart;

m_uTimeOut=uTimeOut;

return TRUE;

}

//删除超时参数

BOOL CTimeOutSock::KillTimeOut()

{

m_llDtStart=0;//表明取消计时

return TRUE;

}

//检查是否超时间

BOOL CTimeOutSock::OnMessagePending()

{

// TODO: Add your specialized code here and/or call the base class

if( m_llDtStart )

{

LARGE_INTEGER lldtEnd;

::QueryPerformanceCounter(&lldtEnd);

LARGE_INTEGER llFrq;

::QueryPerformanceFrequency(&llFrq);

double dbDealy=(double)(lldtEnd.QuadPart-m_llDtStart)*1000/llFrq.QuadPart;

if( dbDealy>m_uTimeOut )

{

CancelBlockingCall();

return FALSE; // No need for idle time processing.

}

}

return CSocket::OnMessagePending();

}
使用方法:在每一次发送或者接收之前,设置超时时间,接收完成后面关闭超时。

CTimeOutSocket m_socket;//定义一个对象

char buf[255];

m_socket.SetTimeOut(5000);//5s超时

m_socket.Receive(buf,100);

m_socket.KillTimeOut();

如果觉得麻烦,可以再socket类中写一个函数OnRecevie包含超时设置和接收函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐