不能触发OnReceive事件了

【天运子】 2010-05-18 11:06:35
用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事件了 为什么?

...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
【天运子】 2010-05-19
  • 打赏
  • 举报
回复
高人 快出来
wswhz1987 2010-05-18
  • 打赏
  • 举报
回复
试一下断开连接,重新连。估计是一直在执行上一个操作请求。还有pMsg在哪里delete的?
【天运子】 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 houbaochen 的回复:]
你还是把发送端和接受端设置一下断点,单步运行一下。定位一下问题,看具体是哪里出了问题。
[/Quote]
我不是已经说了。。。调试很久了 确定问题在那了
houbaochen 2010-05-18
  • 打赏
  • 举报
回复
你还是把发送端和接受端设置一下断点,单步运行一下。定位一下问题,看具体是哪里出了问题。
【天运子】 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 houbaochen 的回复:]
CSockect 是同步的,估计你发的文件很大。应该不是在发送一个文件的过程中产生上述现象,应该是在发送一个文件的同时发送另一个文件。建议用API socket重新封装通讯类,被结合多线程技术。
[/Quote]
我这样和你说把
我发送文件过去 对方没接受
但是也要发送一个消息告诉 发送端 我拒绝了是吧.
我就这样测试也会失败
所以我肯定问题不是在文件传输的时候
是在发送消息的时候


cj1205 2010-05-18
  • 打赏
  • 举报
回复
有可能阻塞了吧?数据进不来了。。。
没做过这方面的,期待高手咯
【天运子】 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shenyi0106 的回复:]
内存泄露了
你的CMessage new出来了没有释放
从你给出的代码看,没有发现有什么问题。
[/Quote]
你说的是pMsg吗 我试过delete了 没用,,,
houbaochen 2010-05-18
  • 打赏
  • 举报
回复
CSockect 是同步的,估计你发的文件很大。应该不是在发送一个文件的过程中产生上述现象,应该是在发送一个文件的同时发送另一个文件。建议用API socket重新封装通讯类,被结合多线程技术。
shenyi0106 2010-05-18
  • 打赏
  • 举报
回复
内存泄露了
你的CMessage new出来了没有释放
从你给出的代码看,没有发现有什么问题。
cj1205 2010-05-18
  • 打赏
  • 举报
回复
CSocket有这样的问题,应该是CSocket实现的问题,建议在 OnRecieve 结束前 加上:
AsyncSelect(FD_CLOSE|FD_READ|FD_WRITE);
【天运子】 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cj1205 的回复:]
这种情形通常是系统缓冲区中的数据未被读完导致的。检查一下,是否因为逻辑错误导致系统缓冲区数据未被全部读完。
[/Quote]
现在认为是m_pArchiveIn这个没释放,,但是不知道在什么时候去释放。。。
cj1205 2010-05-18
  • 打赏
  • 举报
回复
这种情形通常是系统缓冲区中的数据未被读完导致的。检查一下,是否因为逻辑错误导致系统缓冲区数据未被全部读完。
【天运子】 2010-05-18
  • 打赏
  • 举报
回复
快点帮我解决下把,有用到过OnReceive应该了解点把
【天运子】 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wswhz1987 的回复:]
试一下断开连接,重新连。估计是一直在执行上一个操作请求。还有pMsg在哪里delete的?
[/Quote]pMsg的话我试过在发送成功就delete
也还是会出现一样的问题,new出来的我都delete了没用、、

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧