我希望客户正常退出前能发给服务端下线消息所以写了以下代码:服务端接收部分判断:
void fuwuduanReceive::OnReceive(int nErrorCode)
{
  if(str==_T("woxiale"))
  {
   CString name_desu;
   arIn>>name_desu;
   arIn.Close();
   int o=m_pR->m_list.GetCount();
   int counting_go=0;
   for(int u=0;u!=o;++u)
   {
    CString word_to;
    m_pR->m_list.GetText(u,word_to);
    if(name_desu==word_to)
     counting_go=u;
   }
   
   m_pR->m_list.DeleteString(counting_go);
   m_pR->m_out+=name_desu;
   m_pR->m_out+=_T("已下线!\r\n");
                           m_pR->UpdateData(FLASE);
  }
}客户端发送部分:
void CkehuduanDlg::OnDestroy()
{
 CSocketFile file(&MySocket);
 CArchive arOut(&file,CArchive::store);
 CString word(_T("woxiale"));
 arOut<<word;
 arOut<<name;
 arOut.Close();//这句和arOut.Flush()加与不加一样结果
 CDialog::OnDestroy();
 // TODO: 在此处添加消息处理程序代码
}
然后一触发就狂弹出断言错误An attempt was made to access an unnamed file past its end,即过界了,是不是窗口销毁就不能发送的了啊?哎~~~谁来救救我啊!!!!该怎么改啊????? 

解决方案 »

  1.   

       服务端接收部分判断:
    void fuwuduanReceive::OnReceive(int nErrorCode)
    {
      if(str==_T("woxiale"))
      {
      CString name_desu;
      arIn>>name_desu;
      arIn.Close();
      int o=m_pR->m_list.GetCount();
      int counting_go=0;
      for(int u=0;u!=o;++u)
      {
      CString word_to;
      m_pR->m_list.GetText(u,word_to);
      if(name_desu==word_to)
      counting_go=u;
      }
        
      m_pR->m_list.DeleteString(counting_go);
      m_pR->m_out+=name_desu;
      m_pR->m_out+=_T("已下线!\r\n");
      m_pR->UpdateData(FLASE);
      }
    }客户端发送部分:
    void CkehuduanDlg::OnDestroy()
    {
     CSocketFile file(&MySocket);
     CArchive arOut(&file,CArchive::store);
     CString word(_T("woxiale"));
     arOut<<word;
     arOut<<name;// 不加也是错的 CDialog::OnDestroy();
     // TODO: 在此处添加消息处理程序代码
    }
      

  2.   

    别再OnDestory里写
    在OnClose里试试
      

  3.   

    客户端发送部分:
    void CkehuduanDlg::OnDestroy()
    {
     CSocketFile file(&MySocket);
     CArchive arOut(&file,CArchive::store);
     CString word(_T("woxiale"));
     arOut<<word;
     arOut<<name;
    Sleep(100);//加上这个就可以了,原因是还没发过去确认就断开了,TCP认为是不合法的
     CDialog::OnDestroy();
     // TODO: 在此处添加消息处理程序代码
    }