快疯掉了,原来的问题还没有解决,又来信状况了:(我把大体的代码贴一下,大家帮我看看吧:(,真是郁闷
服务器端的:
SOCKET   m_sListen;
WSADATA  wsaData;WSAEVENT m_wAccEvenArr;
m_wAccEvenArr=WSACreateEvent();
if(WSAEventSelect(m_sListen,m_wAccEvenArr,FD_ACCEPT|FD_CLOSE)==SOCKET_ERROR)
{
    CString str;
    str.Format("%d",WSAGetLastError());
    AfxMessageBox(str);
    return FALSE;
}DWORD dwIndex;
  dwIndex=WSAWaitForMultipleEvents(1,m_wAccEvenArr,FALSE,WSA_INFINITE,FALSE);       
   if(dwIndex==WSA_WAIT_FAILED)
  {
AfxMessageBox(" ");
return FALSE;
  }
   dwIndex=dwIndex-WSA_WAIT_EVENT_0;
 if(dwIndex==0)//FD_ACCEPT
 {
WSANETWORKEVENTS wNetwokEvents;
SOCKET sAccept=INVALID_SOCKET;
if(WSAEnumNetworkEvents(m_sListen,m_wAccEvenArr,&wNetwokEvents) ==SOCKET_ERROR)
{
AfxMessageBox("WSAEnumNetworkEvents error");
return false;
}
if(wNetwokEvents.lNetworkEvents&FD_ACCEPT)
{
if(wNetwokEvents.iErrorCode[FD_ACCEPT_BIT]!=0)
                  {
                     AfxMessageBox("FD_ACCEPT error");

}
 sAccept=accept(m_sListen,NULL,NULL);
if(sAccept==INVALID_SOCKET)
AfxMessageBox("Accept_Block error");

WSAEVENT pRecvEvent;
        pRecvEvent=WSACreateEvent();

while(true)
{

          if(WSAEventSelect(sAccept,pRecvEvent,FD_WRITE|FD_READ|FD_CLOSE)==SOCKET_ERROR)
{
   CloseHandle((HANDLE)pRecvEvent);
   CString str;
   str.Format("%d",WSAGetLastError());
  AfxMessageBox(str);
   break;
}
DWORD dwWaitResult;
dwWaitResult = WSAWaitForMultipleEvents(1, pRecvEvent, FALSE,WSA_INFINITE,FALSE);
if (dwWaitResult==WSA_WAIT_FAILED)
{
WSAEventSelect(sAccept, pRecvEvent[1], 0);
CloseHandle(pRecvEvent);
return FALSE;
}
dwWaitResult=dwWaitResult-WSA_WAIT_EVENT_0;

 if(dwWaitResult==0)
{
  WSANETWORKEVENTS wNetworkEvents;
if(WSAEnumNetworkEvents(sAccept,pRecvEvent,&wNetworkEvents) == SOCKET_ERROR)
{
WSAEventSelect(sAccept, pRecvEvent, 0);
CloseHandle(pRecvEvent);
return false;
}
    if(wNetworkEvents.lNetworkEvents&FD_READ||wNetworkEvents.lNetworkEvents&FD_WRITE||wNetworkEvents.lNetworkEvents&FD_CLOSE)
{
if(wNetworkEvents.lNetworkEvents&FD_READ&&wNetworkEvents.iErrorCode[FD_READ_BIT]!=0)
{
 WSAEventSelect(sAccept,pRecvEvent, 0);
          CloseHandle(pRecvEvent);
         AfxMessageBox("FD_READ  error");
break;
}
else
{
AfxMessageBox("触发了读事件");
          int  nRet;
          int idx=0;
char buffer[256];
nRet=recv(sAccept,buffer,256,0);
                     
          if(nRet==SOCKET_ERROR)
{
CString str;
str.Format("读错误º%d",GetLastError());
 AfxMessageBox(str);
         break;
}
else
{
CString str;
buffer[nRet+1]='\0';
str=buffer;
AfxMessageBox(str);
ZeroMemory(buffer,256);
}
if(wNetworkEvents.lNetworkEvents&FD_CLOSE)///////就是这里一直有问题,如果加上这一断
{ ////客户端重新启动后,就提示100048,地址正在使用错误
  AfxMessageBox("´触发了结束事件");//////若不加这一段,就可以连接成功!
  closesocket(sAccept);////////////
              return TRUE;///////////////该段!!!
}////////////////////////////
             
if(wNetworkEvents.lNetworkEvents&FD_WRITE&&wNetworkEvents.iErrorCode[FD_WRITE_BIT]!=0)
{
  AfxMessageBox("FD_WRITE  error");
WSAEventSelect(sAccept,pRecvEvent[1], 0);
  CloseHandle(pRecvEvent[1]);
AfxMessageBox("FD_WRITE  error");
break;
}
else
{
  AfxMessageBox("´触发了写事件");
    
  int nLeft=pSocketInfo->bytesSend;
  int idx=0;
  int nRet;
while(nLeft>0)
{
 nRet=send(sAccept,&(pSocketInfo->bySend[idx]),nLeft,0);      if(nRet=SOCKET_ERROR)
{
AfxMessageBox("写错误");
    break;
}
nLeft=nRet;
idx+=nRet;
}
} }
WSAResetEvent(pRecvEvent);
}
   }

     return TRUE;
}客户端的代码:
客户端在连接成功后立即发送数据
CString str;
str="hello";
send(csock,str,str.GetLength(),0);
str.Empty();
客户端推出时
shutdown(csock,SD_BOTH
closesocket(csock);1 客户端连接成功后,立即向服务器发送消息“hello”,服务器端同时触发了FD_WRITE FD_READ网络事件,这正常吗?
2 当客户端closesocket(csock),服务器端也触发了FD_WRITE ,FD_READ网络事件,这个也正常吗?
3 当我在服务器端处理FD_CLOSE的消息时,执行AfxMessageBox("´触发了结束事件");
closesocket(sAccept);return true;这时如果我重新启动客户端再连接服务器端的时候,服务器端就一直返回100048,地址正在使用的错误,若我不处理FD_CLOSE这个消息,则客户端在重新启动的时候,也不会发生这种错误!!!这到底怎么回事呢?