用CSocket的派生类通讯,在接受一段时间后就不能触发OnReceive事件了 为什么?
但是不知道用什么方法解决?我已经调试很久了 确定 错误就出现在这里了,程序是用来文件传输的
void CServer_TransfersDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件 (*.*)|*.*||", this);
dlg.m_ofn.lpstrTitle = _T("打开");
if(dlg.DoModal() == IDOK)
{
m_strPath = dlg.GetPathName();
m_strFileName = dlg.GetFileName();
SetDlgItemText(IDC_EDIT1,m_strPath); //打开文件
CFile file(m_strPath, CFile::modeRead);
//获取文件大小
m_dwFileSize = file.GetLength(); m_strFileSize.Format("%ld 字节", m_dwFileSize);
GetDlgItem(IDC_FILE_NAME)->SetWindowText(dlg.GetFileName());
GetDlgItem(IDC_FILE_SIZE)->SetWindowText(m_strFileSize);
GetDlgItem(IDC_TRANSFERS_TIP)->SetWindowText(_T("已发送:")); //关闭文件
file.Close();
UpdateData(FALSE); //发出文件发送请求
for (int i=0;i<50;i++)
{
if (m_psockClient[i]!=NULL)
{
CMessage* pMsg = new CMessage(REQUEST, m_strFileName, m_dwFileSize);
m_psockClient[i]->SendMsg(pMsg);
}
}

GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
} //设置等待超时定时器
m_nTimer = SetTimer(1, 50000, NULL);

}
上面是发送端的代码 是用来发送文件属性的一个消息的 下面是接受端的代码,是用来告诉对方文件请求被接受且准备好接收
LRESULT CClient_TransfersDlg::OnAcceptTransfers(WPARAM wParam, LPARAM lParam)
{
//告诉对方文件请求被接受且准备好接收
CMessage* pMsg = new CMessage(ACCEPT);
m_psockClient->SendMsg(pMsg);
return 0;
}
问题就是这2个地方了 运行一段时间后,这2个地方发送消息的时候,不能触发
void CClientSocket::OnReceive(int nErrorCode) 
{
m_pdlgMain->ProcessReceive(this);
CSocket::OnReceive(nErrorCode);
}
上面的函数了,,先说下 程序能运行 并且成功,只是在运行一段时间后就不能触发OnReceive事件了 为什么?

解决方案 »

  1.   

    内存泄露了
    你的CMessage new出来了没有释放
    从你给出的代码看,没有发现有什么问题。
      

  2.   

    CSockect 是同步的,估计你发的文件很大。应该不是在发送一个文件的过程中产生上述现象,应该是在发送一个文件的同时发送另一个文件。建议用API socket重新封装通讯类,被结合多线程技术。
      

  3.   

    你说的是pMsg吗  我试过delete了 没用,,,
      

  4.   

    试一下断开连接,重新连。估计是一直在执行上一个操作请求。还有pMsg在哪里delete的?
      

  5.   

    pMsg的话我试过在发送成功就delete
    也还是会出现一样的问题,new出来的我都delete了没用、、
      

  6.   

    快点帮我解决下把,有用到过OnReceive应该了解点把
      

  7.   

    现在认为是m_pArchiveIn这个没释放,,但是不知道在什么时候去释放
      

  8.   

    CSocket有这样的问题,应该是CSocket实现的问题,建议在   OnRecieve   结束前   加上:   
      AsyncSelect(FD_CLOSE|FD_READ|FD_WRITE);