我用mfc socket实现了一个登录系统,登录界面窗口可以接收到来自服务器端的消息

我的问题是:在登录成功之后,怎么让弹出来的用户操作界面窗口能够接收到服务器端发的消息
急啊,希望大牛们帮助我!一旦成功,再加30分!!!!在线等!

第1个回答  2012-12-23
是一个网络内, 还是跨局域网?
第2个回答  2012-12-23
登录时验证账号密码时不是连接了服务嘛,验证完后你就关了?没有关的话,服务器发送消息过来OnXXX就会进行响应提示有消息。追问

onXXX函数应该在哪申明呢,我是每个窗口都有一个onXXX函数,这样可以吗?
原本的窗口并没有关闭,只是在后台而已

追答

额,OnXXX是指重载的OnReceive,OnAccept。当服务器有消息发送过来时,通信模块通过OnReceive通知socket有消息可以接收,所以在OnReceive中进行操作就行了。

追问

我是希望能在窗口里映射消息,响应消息,应该怎么做呢

追答

之前不对,乱了。
在登录窗口自定义一个消息,假如为UM_SVR_LOGIN。
当服务器发送消息过来了,OnReceive将会被调用并通知主窗口有消息可接收。(也可以让OnReceive直接通知登录窗口,但这就需要CConnectSoc中保留登录窗口的指针,程序模块的独立性就差了)
(一)----------------------------------------------------------------
主窗口接收消息,处理服务器的消息的内容,然后将结果发送给登录窗口。
logindlg.PostMessage(UM_SVR_LOGIN,结果1,结果2)。
登录窗口中的响应函数对发送过来的结果进行处理就行了。
(二)--------------------------------------------------------------
也可以直接从主窗口发送套接字对象的指针,让登录窗口自己去处理。
主窗口的OnReceive中:
logindlg.PostMessage(UM_SVR_LOGIN,&m_sock);
登录窗口的响应函数中:
CConnectSoc* pSock=(CConnectSoc*)wParam;

追问

要怎么通知所有窗口收到消息了呢?
还有logindlg并没有postmessage这个函数啊

追答

用自定义消息,这个你应该会的。
比如在登录窗口中定义了消息UM_SVR_LOGIN。
那么在主窗口中:logdlg.PostMessage(UM_SVR_LOGIN);就发送了消息UM_SVR_LOGIN给登录窗口,登录窗口收到后,响应函数(假设是OnSvrLogin)OnSvrLogin就会被执行,也就是响应了这个消息。
所有窗口都要收到的话,只能挨个窗口发了(可能是我技术不够,只想到这个办法)。

追问

那怎么在onreceive里把消息传给当前活动窗口呢?而且登录窗口弹出后,主窗口在后台还能收到消息吗?
在onreceive中:AfxGetMainWnd()->SendMessage(WM_NEWMESSAGE, (WPARAM)&rece);用这句来通知
能不能改造下通知当前窗口呢?

追答

主窗口可以收到消息并且响应消息。
AfxGetMainWnd()->SendMessage(WM_NEWMESSAGE, (WPARAM)&rece);
rece是主窗口传递给CConnectSoc的吗?rece是主窗口中定义的套接字吧。OnReceive中随便发送个消息告诉主窗口有消息可接收就行了,主窗口知道后,是接收消息处理,还是直接发送套接字对象指针给登录窗口就随便了。

本回答被提问者采纳
第3个回答  2012-12-23
你的套接字是如何设置的?同步还是异步?把初始化代码拿来看一下呢,好针对你的需要提一些建议。追问

这是客户端的socket

然后再客户端的主窗口内定义了:LRESULT OnNewMessage(WPARAM wParam, LPARAM);来获取消息

可是当我在弹出窗口内定义了同样的LRESULT OnNewMessage(WPARAM wParam, LPARAM);时,却无法得到消息

 

 

你要是对mfc socket很在行的话,可以把代码发给你看看

追答

我不在行,只是之前用它做过一些程序,也做过你说的不同窗口来接收的情况。gwlprogrammer@hotmail.com

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网