我自定义了一个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);
}

解决方案 »

  1.   

    CServerSocket::CServerSocket(CMainFrame* pFrame)
    {
        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中通过循环读取,把数据读完
      

  2.   

    记得好像最大是64K吧。
    至于OnReceive的用法,MSDN上有例子,可以参考下
      

  3.   

    有现成的复制下贴起// AdSocket.cpp : 实现文件
    //#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();
    }
      

  4.   


    确实发了数据,只要能触发OnReceive就能收到数据
    另外,如果程序设置断点,并且调试程序也能触发OnReceive并收到数据