server程序只能收到FD_ACCEPT,其他的都收不到!!
客户程序应该没问题,客户程序连接server,MessageBox(NULL,"FD_ACCEPT有工作站连接上了服务器。",0,0);可是退出,发送消息等都没反映。不知道哪里错了,请高手帮助
server代码如下: SOCKET Accept,ServerSocket,SocketArray[WSA_MAXIMUM_WAIT_EVENTS];                 //SOCKET 
SOCKADDR_IN m_sockServerAddr;          //SOCKET 结构
BOOL IsTrue;
WSAEVENT hEvent,EventArray[WSA_MAXIMUM_WAIT_EVENTS];
WSANETWORKEVENTS nevents;
DWORD Index,i ;
DWORD EventTotal = 0;
void RunSockServer(); //启动sock
void OnAccept();
RunSockServer(); //启动sock
while(true)
{
OnAccept( );
}
void RunSockServer()
{
//初始化与绑定服务器
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL

 MessageBox(NULL,"Winsock can not init !",0,0);
         WSACleanup();
         return;
}
ServerSocket=socket(PF_INET,SOCK_STREAM,0);    //创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信    if(ServerSocket == INVALID_SOCKET)
{
MessageBox(NULL,"无法创建服务器socket !",0,0);
         return;
}    m_sockServerAddr.sin_family = AF_INET;
    m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;   //向所有的IP地址发送消息
    m_sockServerAddr.sin_port = htons(8001);    if (bind(ServerSocket,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
    {
MessageBox(NULL,"无法绑定服务器 !",0,0);
        return;
} hEvent = WSACreateEvent();
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_READ| FD_WRITE|FD_CLOSE);
if(result == SOCKET_ERROR)
{
MessageBox(NULL,"SOCKET_ERROR !",0,0);
return ;
}
    if (listen(ServerSocket,5) == SOCKET_ERROR) //开始监听客户连接请求
{
MessageBox(NULL,"服务器监听失败 !",0,0);
        return;
}

SocketArray[EventTotal] = ServerSocket;
EventArray[EventTotal] = hEvent;
EventTotal++;
IsTrue = TRUE;
MessageBox(NULL,"服务器绑定监听成功 !",0,0);
    return; 
}
void OnAccept()
{//自定义接收客户机请求的消息  

Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
Index= Index - WSA_WAIT_EVENT_0; for (i = Index;i<EventTotal;i++)
{
Index=WSAWaitForMultipleEvents(1,&EventArray[i],TRUE,1000,FALSE);

if ((Index == WSA_WAIT_FAILED)||(Index== WSA_WAIT_TIMEOUT))
continue;
else
{
Index = i;
WSAEnumNetworkEvents(SocketArray[Index],EventArray[Index],&nevents);
if (nevents.lNetworkEvents &FD_ACCEPT)
{
Accept = accept(SocketArray[Index],NULL,NULL);
if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
MessageBox(NULL,"EventTotal > WSA_MAXIMUM_WAIT_EVENTS",0,0);
closesocket(Accept);
break;
}

hEvent = WSACreateEvent();
int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_CLOSE);
if(result == SOCKET_ERROR)
{
MessageBox(NULL,"SOCKET_ERROR !",0,0);
return ;
}
SocketArray[EventTotal] = Accept;
EventArray[EventTotal] = hEvent;
EventTotal++;
MessageBox(NULL,"FD_ACCEPT有工作站连接上了服务器。",0,0);
} if (nevents.lNetworkEvents &FD_READ)
{
MessageBox(NULL,"FD_READ。",0,0);
} if (nevents.lNetworkEvents &FD_WRITE)
{
MessageBox(NULL,"FD_WRITE。",0,0);
} if (nevents.lNetworkEvents &FD_CLOSE)
{
closesocket(SocketArray[Index]);
EventTotal--;
MessageBox(NULL,"关闭。",0,0); }
}
}
return ;
}

解决方案 »

  1.   

    很有几处错误:hEvent = WSACreateEvent();
    int result = WSAEventSelect(ServerSocket,hEvent,FD_ACCEPT |FD_CLOSE);
    错误,应该改为:int result = WSAEventSelect(Accept,hEvent,FD_WRITE|FD_SEND |FD_CLOSE);  
      

  2.   

    还有一点补充的是,你的OAccept()错误的地方很多,代码很乱,建议重写!
      

  3.   

    同意楼上,一般serversocket只要select消息accept、close就好了,
    accept得到的socket等待read、write、close三个事件