Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Server端的CSocket.OnClose为什么没被触发

16 views
Skip to first unread message

Ryan

unread,
May 7, 2008, 5:43:33 AM5/7/08
to
使用CSocket编写一个Socket Server程序,主要功能是:
使用TCP协议,在一个端口侦听,接收所有连接请求,并将发送来的数据打印到窗口中。

class CServerSocket : public CSocket
{
//重载OnClose. 希望被触发,清除vector
//重载OnAccpet. new 一个CClientSocket, 并将该指针放在一个vector中
}

class CClicentSocket : public CSocket
{
//重载OnClose. 销毁对象 (delete this)
//重载OnReceive. 接收数据
}

主函数
{
m_ServerSocket.Create(5000); // 这是一个成员变量
m_ServerSocket.Listen();
...
}

当CClientSocket执行方法Close()后,CClicentSocket.OnClose被触发
但CServerSocket.OnClose并没有被触发,即使执行CServerSocket.Close,CServerSocket.OnClose也没有被触发。

MSDN的意思好象是,一旦连接关闭,Server socket的事件OnClose应该被触发。
为什么就是不触发???????

Ryan

unread,
May 8, 2008, 9:01:33 AM5/8/08
to
怎么没有人回答,难道都不用CSocket吗?
我以前一直用标准的套接字编程,这次特意使用CSocket编写,以便做一番了解!


"Ryan" <the_t...@hotmail.com> 写入消息
news:CDE31EE9-BF5E-443B...@microsoft.com...

Ryan

unread,
May 12, 2008, 1:44:04 AM5/12/08
to

"Ryan" <the_t...@hotmail.com> 写入消息
news:CDE31EE9-BF5E-443B...@microsoft.com...

Jim

unread,
May 12, 2008, 1:59:11 AM5/12/08
to
你看看能不能收到其他的消息,send,recv等消息!
"Ryan" <the_t...@hotmail.com> wrote in message
news:CDE31EE9-BF5E-443B...@microsoft.com...

Ryan

unread,
May 12, 2008, 3:12:18 AM5/12/08
to

Jim

unread,
May 12, 2008, 6:12:19 AM5/12/08
to
有三种可能
1:mfc的消息,确实发了,但是你的窗口没有收到,需要有一个全局的转发
while( peekMessage(&msg,0,0,0,PM_REMOVE))
{
Tanslatemessage(&msg);
dispatchmessage(&msg);
}
2:问题处在client端close的时候不是使用both参数(我猜的)有可能server那边不知道client已经close了

3:有可能是你用错了,你没有在与client连接的套接字上监听消息,你只在accept的套接字上监听消息

我可能说错了,我对mfc不熟悉,还请指教!!

"Jim" <jimz...@voicecyber.com> wrote in message
news:OBEo$V$sIHA...@TK2MSFTNGP05.phx.gbl...

Ryan

unread,
May 12, 2008, 9:54:37 PM5/12/08
to
1. CSocket类内置了一个窗口类CSocketWnd,该窗口负责消息的接收、转发。我们可以通过下列方法获得该窗口句柄(在CSocket类里)
AFX_MODULE_THREAD_STATE *pState = AfxGetModuleThreadState();
pState->m_hSocketWindow;
也就是说该窗口类已经将消息截获,我想通过你写的while循环无法再次获得消息,因为好像没发现哪里可以干预CSocketWnd如何接收消息

2. 我查了MSDN,CAsyncSocket/CSocket::Close并不需要参数呀!在哪里指定“both”参数?

3. MFC的CSocket类内置CSocketWnd类,他负责将消息转发,我不需要监听,只需要重载OnAccept/OnClsoe/OnReceive即可。

"Jim" <jimz...@voicecyber.com> 写入消息
news:eYy6TjBt...@TK2MSFTNGP05.phx.gbl...

Jim

unread,
May 12, 2008, 10:12:29 PM5/12/08
to
我可能没有说清楚:
你的onclose是在哪里实现的?
onaccept是怎么实现的?
你把代码给我看,我给你指出来,我感觉我已经知道问题的所在了!

另外你创建的应该是mfc工程吧,这样的话就不需要我说的第一种情况了!


"Jim" <jimz...@voicecyber.com> wrote in message

news:eYy6TjBt...@TK2MSFTNGP05.phx.gbl...

Jim

unread,
May 12, 2008, 11:36:39 PM5/12/08
to
明白了!
CSocketServer仅仅只是监听然后将连接转给CSocketClient,当连接断开后当然是只有CSocketClient收到close消息了!CSocketServer能收到才见鬼!
你说CSocketServer自己执行close,但是这时后CSocketServer上都没有连接啊,这是mfc里面的实现,收不到onclose消息不奇怪!

这是我的一点看法,我们可以讨论!


"Jim" <jimz...@voicecyber.com> wrote in message

news:usZL57Jt...@TK2MSFTNGP04.phx.gbl...

Ryan

unread,
May 12, 2008, 11:57:57 PM5/12/08
to
谢谢谢谢谢!

欧,确实是我傻了,连接已经被转到CClientSocket中了,所以Client的断开,应该只通知CClient

关于CServerSocket,我想做的是,在停止监听后,做一些清除操作,那应该响应哪个事件?

Jim

unread,
May 13, 2008, 12:59:52 AM5/13/08
to
什么时候停止监听需要你自己做一些动作的吧,具体怎么停止我不知道,应该是没有消息的!

"Jim" <jimz...@voicecyber.com> wrote in message
news:OpYODrKt...@TK2MSFTNGP03.phx.gbl...

Ryan

unread,
May 13, 2008, 2:45:43 AM5/13/08
to
0 new messages