为什么WSAAsyncSelect发送消息后关联窗口没有响应该消息?在线等待

匪六哥 2003-08-12 02:54:34
我自己希望创建一个信息发送的socket类,非标准MFC提供的CSocket类,在该类的Create函数中,我使用
#define IP_EVENT WM_USER+166//定义消息号

sockaddr_in name;
name.sin_family = AF_INET;
name.sin_port = 5000;//创建待绑定的端口号
m_Socket=socket(AF_INET,type,protocol);
bind(m_Socket, name, sizeof(sockaddr);//绑定端口
RECT rect;
rect.left=0;
rect.top=0;
rect.right=0;
rect.bottom=0;
CWnd* pWnd=AfxGetMainWnd();
m_pTcpMsgWnd=new CTcpMsgWnd();//创建和网络注册信息相关联的隐形窗口,
WSAAsyncSelect(m_Socket,m_pTcpMsgWnd->m_hWnd ,IP_EVENT,FD_ACCEPT | FD_CONNECT | FD_CLOSE | FD_WRITE | FD_READ);//使该socket类和该窗口相关联。

在窗口函数中,
BEGIN_MESSAGE_MAP(CTcpMsgWnd, CWnd)
//{{AFX_MSG_MAP(CMsgWnd)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_MESSAGE(IP_EVENT,OnIpEvent)//使该窗口响应IP_EVENT消息
END_MESSAGE_MAP()
//具体函数如下:
void CTcpMsgWnd::OnIpEvent (WPARAM wParam, LPARAM lParam)
{
SOCKET Socket;
TcpipSocket* pSock;

Socket=(SOCKET)wParam;

if(SocketMap.Lookup(Socket,pSock)==0) //no such socket
return;

int event=WSAGETSELECTEVENT(lParam);
int error=WSAGETSELECTERROR(lParam);

switch(event)
{
case FD_CONNECT:
pSock->OnConnect(error);
break;
case FD_WRITE:
pSock->OnSend(error);
break;
case FD_CLOSE:
pSock->OnClose (error);
break;
case FD_READ:
pSock->OnRecieve (error);
break;
case FD_ACCEPT:
pSock->OnAccept (error);
break;
default:
break;
}
}


按一般情况,这个时候如果5000端口收到东西,就应该自动进入OnIpEvent 函数,可是,当真正有东西到来时,却没有触发该函数,我是第一次作这样相关的东西,我看别人都是这么作的,可我的为什么不行呢?迷茫
...全文
36 点赞 收藏 3
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuwy 2003-09-18
又是句柄问题,我教你个方法,主窗口生成时,你用this指针获得它的句柄并记录,然后将他作为全局变量传入,我的问题就是这么解决的
回复
匪六哥 2003-08-13
现在我已找出问题的所在:
CWnd* pWnd=AfxGetMainWnd();//意欲获得主窗口句柄;
m_pTcpMsgWnd=new CTcpMsgWnd();//创建和网络注册信息相关联的隐形窗口
m_pTcpMsgWnd->Create(NULL,"Message Window",0,rect,pWnd,0);//生成隐形窗口
可是我发现CWnd* pWnd=AfxGetMainWnd();时主窗口句柄没有。主窗口是这样生成的:
在初始化时,通过CSvclntDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
指定并生成主窗口;
在主窗口的初始化程序中,调用login窗口
CLoginDlg LoginDlg;
LoginDlg.DoModal();
在login窗口中,用到socket发送指令,测得发送命令正常。
到底我该怎样指定
m_pTcpMsgWnd->Create(NULL,"Message Window",0,rect,pWnd,0);
m_pTcpMsgWnd的父窗口如何生成并指定呢?
请多多指教,着急,请尽快回复。如果方便可以电话联系
回复
cxf1976 2003-08-12
gz
回复
发动态
发帖子
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
社区公告
暂无公告