为什么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 函数,可是,当真正有东西到来时,却没有触发该函数,我是第一次作这样相关的东西,我看别人都是这么作的,可我的为什么不行呢?迷茫