我从CAsyncSocket继承了一个类MySocket
重载了 这几个函数: OnAccept、OnClose、OnConnect、OnReceive、OnSend
实现很简单 就是弹出一个对话框(还在 OnReceive中接收数据) 如:void MySocket::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
::AfxMessageBox(L"OnClose");
CAsyncSocket::OnClose(nErrorCode);
}
在客户端用该类想实现以下最基本的功能:
1:连接到服务器上;
2:向服务器发送数据;
3:接收服务器发送的数据;
4:与服务器断开连接;现在 用该类的 Connect方法连接到服务器上后 可以发送与接收数据就是不能与服务器断开连接, 
调用 Close() 后没有弹出"OnClose"对话框, 部分代码如下:g_pMySocket  为全局的MySocket对象已经在对话框的 OnInitDialog 中调用过 Create// 连接到服务器或与服务器断开连接 
// 如果当前正在连接则断开
void CClientDlg::OnBnClickedButtonConnection()
{
this->UpdateData(TRUE);
//::memset(this->btTemp, 0, sizeof(this->btTemp));
// 单击按钮之前正处于连接状态
if(::g_blConnection) // g_blConnection 用于记录当前是连接还是已经断开
{
// 断开与服务器的连接
//g_pMySocket->Detach(); // 
g_pMySocket->Close();    // 关闭时会执行该行
//g_blConnection = FALSE; // 在OnClose中如果关闭成功才设为FALSE
//g_pMySocket->KillSocket(::g_pMySocket->m_hSocket, (CAsyncSocket* )g_pMySocket);// 调用时出错
}
else
{
// 连接到服务器
this->m_ipaddSrv.GetWindowTextW(strTemp);
g_pMySocket->Connect(strTemp, this->m_uPort);
this->SetDlgItemTextW(IDC_BUTTON_CONNECTION, L"连接...");
}
}问题就是无法与服务断开连接 g_pMySocket->Close(); 已经调用 但g_pMySocket的OnClose没执行(把服务端进程关了也不行)
请问是什么原因啊??  
小弟是个菜鸟昨天刚学socket编程, 请教前辈以上问题是什么原因造成的, 还有对socket初学者来说应该注意些什么??

解决方案 »

  1.   

    你的g_pMySocket怎么创建的?试试delete
      

  2.   


    在头文件中申明MySocket* g_pMySocket=NULL;在程序的 InitInstance() 中分配空间g_pMySocket=new MySocket();Create() 是在对话框中的 OnInitDialog 中调用的
      

  3.   

    用delete试试 你new出来的需要delete
      

  4.   

    如果是在InitInstance()new的话,用不着在断开连接的时候delete,在ExitInstance()里delete更合理,这样可能好点
    pSocket->ShutDown(CAsyncSocket::both);
    pSocket->Close();还有,你的代码能够使客户端与服务器端断开,服务器端会收到断开消息,如果服务器端你用的是该类,那么服务器端OnClose会执行。同样,服务器端停止,你的客户端可以收到断开消息,客户端OnClose会执行。