一个CAsyncSocket的简单问题,, 高手来帮看看

「已注销」 2010-05-29 01:04:53
我从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初学者来说应该注意些什么??
...全文
98 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
悟迟 2010-05-31
  • 打赏
  • 举报
回复
如果是在InitInstance()new的话,用不着在断开连接的时候delete,在ExitInstance()里delete更合理,

这样可能好点
pSocket->ShutDown(CAsyncSocket::both);
pSocket->Close();

还有,你的代码能够使客户端与服务器端断开,服务器端会收到断开消息,如果服务器端你用的是该类,那么服务器端OnClose会执行。

同样,服务器端停止,你的客户端可以收到断开消息,客户端OnClose会执行。
【天运子】 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sherlinlove 的回复:]
引用 1 楼 meng_huali 的回复:

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


在头文件中申明

C/C++ code

MySocket* g_pMySocket=NULL;


在程序的 InitInstance() 中分配空间

C/C++ code

g_pMySocket=new MySocket();


Create(……
[/Quote]用delete试试 你new出来的需要delete
「已注销」 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 meng_huali 的回复:]

你的g_pMySocket怎么创建的?试试delete
[/Quote]

在头文件中申明

MySocket* g_pMySocket=NULL;

在程序的 InitInstance() 中分配空间

g_pMySocket=new MySocket();

Create() 是在对话框中的 OnInitDialog 中调用的
【天运子】 2010-05-29
  • 打赏
  • 举报
回复
你的g_pMySocket怎么创建的?试试delete

18,356

社区成员

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

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