我在单文档OnInitialUpdate()中定义个对话框对象
CChat dlg;
dlg.DoModal();
dlg.InitSocket();
准备程序运行后自动打开一个聊天对话框,但是运行后显示“注册网络读取事件失败”
即此函数出现问题WSAAsyncSelect(m_socket,this->m_hWnd,UM_SOCK,FD_READ)
请问该怎样解决?如不用单文档打开对话框,直接用基于对话框的话,没有问题。这是为什么?
BOOL CChat::InitSocket()
{
//加载异步套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {

return FALSE;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( );
return FALSE; 
} syit syit

m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);  //使用UDP 
if(INVALID_SOCKET==m_socket)
{
MessageBox("创建套接字失败!");
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6500);  //使用6500端口
if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
MessageBox("绑定失败!");
return FALSE;
}
if(SOCKET_ERROR==WSAAsyncSelect(m_socket,this->m_hWnd,UM_SOCK,FD_READ))
{
MessageBox("注册网络读取事件失败!");
return FALSE;
} return TRUE;
}

解决方案 »

  1.   

    你要先初始化SOCKET,才能使用SOCKET APIDoModal显示的是模态对话框,把InitSocket调到DoModal前面来CChat dlg; 
    dlg.InitSocket();
    dlg.DoModal(); 
      

  2.   

    SOCKET已经在对话框类中定义了
    改完后还是不对
      

  3.   

    if(SOCKET_ERROR==WSAAsyncSelect(m_socket,this->m_hWnd,UM_SOCK,FD_READ)) 
    这一句之前你判断一下m_hWnd是否有效!
    再根据WSAAsyncSelect的返回值和WSAGetLastError()的错误代码判断错误的原因。