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

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包含超时设置和接收函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值