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包含超时设置和接收函数。
原理: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包含超时设置和接收函数。
相关文章推荐
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- 设置socket接收和发送超时的一种方式
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码(用socket解释http,不错)
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
- SOCKET 发送和接收数据设置
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- 设置SOCKET的发送与接收缓冲区
- 【c#】设置Socket连接、接收超时
- 基于udp的网络编程socket的错误10054与SOCKET的发送与接收缓冲区的设置(udp丢包)
- 设置SOCKET的发送与接收缓冲区
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- C语言socket编程设置接收超时(Window&Linux)
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- 关于linux下的udp/tcp通信设置发送sendto/接收recvfrom信息超时的参数。解决通道堵塞问题。
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- Apache CXF 添加日志(控制台输入xml)、发送接收消息超时设置
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
- socket通信阻塞模式下,设置发送和接受函数超时