我自定义了一个Socket类,继承自CSocket,并重写了OnReceive()这个函数但在实际接收的时候,一开始能触发OnReceive()函数,但接收一段时间(有时几秒,有时几分钟)之后就不能触发了。有时一开始就不能触发,但如果程序设置了断点并执行程序调试,就能触发OnReceive()请各位大侠帮帮忙!extern CStdioFile g_file;CServerSocket::CServerSocket(CMainFrame* pFrame)
{
m_pFrame = pFrame;
int nRecvBuf = 1024*1024*1024;
setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, (char*)&nRecvBuf, sizeof(nRecvBuf));
}CServerSocket::~CServerSocket()
{
}void CServerSocket::OnReceive(int nErrorCode)
{
CString strTmp;
CTime time = CTime::GetCurrentTime();
strTmp = time.Format("%Y_%m_%d_%H-%M-%S\n");
g_file.WriteString(strTmp); // 将触发的时间写入文本,以确认是否触发了些函数
int tmp;
Receive(&tmp, 4);
strTmp.Format(_T("类型%d,"), tmp);
g_file.WriteString(strTmp);
m_pFrame->RecvData(tmp);
AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE ); // 网上有人说添加此句可以解决问题,但在我这就不行
CSocket::OnReceive(nErrorCode);
}
{
m_pFrame = pFrame;
int nRecvBuf = 1024*1024*1024;
setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, (char*)&nRecvBuf, sizeof(nRecvBuf));
}CServerSocket::~CServerSocket()
{
}void CServerSocket::OnReceive(int nErrorCode)
{
CString strTmp;
CTime time = CTime::GetCurrentTime();
strTmp = time.Format("%Y_%m_%d_%H-%M-%S\n");
g_file.WriteString(strTmp); // 将触发的时间写入文本,以确认是否触发了些函数
int tmp;
Receive(&tmp, 4);
strTmp.Format(_T("类型%d,"), tmp);
g_file.WriteString(strTmp);
m_pFrame->RecvData(tmp);
AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE ); // 网上有人说添加此句可以解决问题,但在我这就不行
CSocket::OnReceive(nErrorCode);
}
解决方案 »
- 关于P2P传输的理论分析之节点排序
- 【100分求解疑惑】AcquireCredentialsHandle函数调用的疑惑
- [散分]继续分享 VC++6.0调试篇:定位临界区(critical section)导致的死锁
- 求VISUAL C++MFC扩展编程实例
- if the parameter is a[] in a function,what does it mean?
- 在对话框中如何实现图形的重画??在线等
- 大侠们帮忙支个招啊,关于ActiveX DLL,用于HTML ,多加点分,或请客都没问题!
- 如何删除一个不为空的文件夹
- 一个关于MENU的问题
- 110分求助,请去我另一个帖子拿分,关于MsComm控件的问题
- ADO数据库编程
- 求反向运动学代码
{
m_pFrame = pFrame;
int nRecvBuf = 1024*1024*1024;
setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, (char*)&nRecvBuf, sizeof(nRecvBuf));
}额,你的缓冲区设置的也太大了吧?
另外,不需要
AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );
还有,在OnReceive中通过循环读取,把数据读完
至于OnReceive的用法,MSDN上有例子,可以参考下
//#include "stdafx.h"
#include "AdSocket.h"// CAdSocket
CAdSocket::CAdSocket()
{
}CAdSocket::~CAdSocket()
{
}// CAdSocket 成员函数BOOL CAdSocket::CreateSocket(UINT port)
{
bufPos = 0;
m_port = port;
ReceiveBuffer = new char[MAX_BUFFER_NUM*MAX_SOCKET_LENTH];
memset(ReceiveBuffer+0,0,MAX_SOCKET_LENTH);
return Create(port,SOCK_DGRAM);
}void CAdSocket::OnReceive(int errcode)
{
int retvalue;
UINT port;
CString str;
retvalue = ReceiveFrom(ReceiveBuffer+bufPos*MAX_SOCKET_LENTH , MAX_SOCKET_LENTH,str,port);
if(retvalue == SOCKET_ERROR || port != m_port)
return;
memcpy(ReceiveBuffer+bufPos*MAX_SOCKET_LENTH+2*CTRL_LENTH,str,str.GetLength());
::AfxGetApp()->PostThreadMessage(MSG_SOCKET_RECEIVE,retvalue,(LPARAM) ReceiveBuffer+bufPos*MAX_SOCKET_LENTH);
bufPos++;
if (bufPos >= MAX_BUFFER_NUM)
bufPos = 0;
memset(ReceiveBuffer+bufPos*MAX_SOCKET_LENTH,0,MAX_SOCKET_LENTH); CSocket::OnReceive(errcode);
}void CAdSocket::SendMsgData(char * data , int len, LPCTSTR address)
{
SendTo(data, len, m_port, address);
}void CAdSocket::CloseSocket()
{
delete ReceiveBuffer;
Close();
}
确实发了数据,只要能触发OnReceive就能收到数据
另外,如果程序设置断点,并且调试程序也能触发OnReceive并收到数据