代码如下:BOOL CServerDlg::InitSocket()//初始化套接字
{
         m_socket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
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(PORT); if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
MessageBox("绑定失败!");
return FALSE;
}
if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_ACCEPT|FD_CLOSE))
{
MessageBox("m_socket注册网络读取事件失败!");
return FALSE;
} if(SOCKET_ERROR==listen(m_socket,LISTEN_CONNBACKLOG))
{
MessageBox("监听失败!");
return FALSE;
}
return TRUE;
}void CServerDlg::OnSock(WPARAM wParam,LPARAM lParam)//消息响应函数
{
switch(WSAGETSELECTEVENT(lParam))//检查网络事件
{
          case FD_ACCEPT://响应
if(sAccept=accept(wParam,NULL,NULL)==INVALID_SOCKET)
{
MessageBox("accept失败!");
break;
}
           //这里出错!!!!!!!!!!!!!!!!!!!!!!!!!!
if(SOCKET_ERROR==WSAAsyncSelect(sAccept,m_hWnd,UM_SOCK,FD_READ|FD_CLOSE))
        {
MessageBox("sAccept注册网络事件失败!");
return ;
         }
        //

    break;
case FD_READ:
          .......

在运行时会出现 :“sAccept注册网络事件失败!”
也就是在case FD_ACCPET 里面为新产生的sAccept注册FD_READ|FD_CLOSE时候,报错。为什么呢?我的本意是为每一个新生的accept套接字单独响应事件。
望高人赐教!谢谢!

解决方案 »

  1.   

    已经初始化了,而且在InitSocket()里为主套接字m_socket注册事件是成功的。如果把OnSock(WPARAM wParam,LPARAM lParam)里面的
    FD_ACCPET 出错的这段去掉,工作就正常,也就是这段:
    if(SOCKET_ERROR==WSAAsyncSelect(sAccept,m_hWnd,UM_SOCK,FD_READ|FD_CLOSE))
    {
    MessageBox("sAccept注册网络事件失败!");
    return ;
    }但是这样就没有给每个新生的accpt套接字单独注册事件,但是工作确正常。从字面上看好像只给了主套接字,也就是监听套接字m_socket注册成功了,但是工作正常。
      

  2.   

    if (WSAGETSELECTERROR(lParam))
    {
    OutputLog("Socket failed with error %d\n", WSAGETSELECTERROR(lParam));
    }
    看看是不是有什么错误发生?
      

  3.   

    感谢各位的回帖,但是问题依然存在还有一点疑惑如果在监听m_socket上注册了 ACCPET、READ、WRITE 等事件,那么按道理说,由监听套接字新生的Accept套接字就自动被设定为异步,那么为什么网上所有的例子代码都要在消息实现函数中的FD_ACCPET中重新为新生的套接字再注册一遍READ WRITE等事件呢?是不是多此一举呢?我的这代码似乎就是这个问题:如果只在InitSocket()中把主套接字的注册事件变为 “FD_ACCEPT|FD_READ|FD_CLOSE”,然后在消息实现函数的 case FD_ACCPET中不注册任何事件,就一切正常。
    困惑了,小弟等待高哥出现!