none
求助!!! 重叠模型之Select I/O 网络编程 RRS feed

  • 问题

  •  

    DWORD WINAPI CCallServerDlg::ThreadSelect(LPVOID lpParameter)
    {
     SOCKET sListen=(SOCKET)lpParameter;
     FD_SET fdSocket;
     FD_ZERO(&fdSocket);
     FD_SET(sListen,&fdSocket);
     CString strIP;
     timeval timeout;
     timeout.tv_sec=5;
     _SENDDATA recvPacket;//需要注意的地方
     MateMap::iterator iter;

     while(true)
     {
      fd_set fdRead = fdSocket;
      int nRet=:Tongue Tiedelect(0,&fdRead,NULL,NULL,NULL);
      if(nRet>0)
      {
       //检查是否有新数据或者新客户发送过来
       for(int i=0;i<(int)fdSocket.fd_count;i++)
       {
       //检查是否有新连接的到来
       if(FD_ISSET( fdSocket.fd_arrayIdea, &fdRead))   
       { if(fdSocket.fd_arrayIdea==sListen)   
        {
       
        sockaddr_in addrRemote;
        int nAddrLen=sizeof(addrRemote);
        SOCKET sNew=::accept(sListen,(sockaddr*)&addrRemote,&nAddrLen);
        FD_SET(sNew,&fdSocket);
        strIP.Format( "%s",inet_ntoa(addrRemote.sin_addr) );
        CString str;
        str.Format("the clinet have Come IP is %s",strIP);
        WriteLog("log.txt",str);
        
        } //end if
        else
        {
         int nRecev=::recv(fdSocket.fd_arrayIdea,(char*)&recvPacket,sizeof(recvPacket),0);
         if(nRecev>0)
         {
           

          if(recvPacket.szTel[0]=='N')
          {
           TRACE("the clinet exited ,the channel is%i\b \n",recvPacket.iExNum);

           critical_section.Lock();
           g_myMap.erase(recvPacket.iExNum);
           critical_section.Unlock();
           
           CString str;
           str.Format("the channel is %d has exit",recvPacket.iExNum);
           WriteLog("log.txt",str);

           ::closesocket(fdSocket.fd_arrayIdea);
           FD_CLR(fdSocket.fd_arrayIdea,&fdSocket);
          
          }
          else
          {
           //判断此IP是否已经在MAP中
           iter =  g_myMap.find(recvPacket.iExNum);
           if( iter==g_myMap.end())
           {
            int inum = recvPacket.iExNum;
            
            critical_section.Lock();
            //将获得的分机号与之对应的socket放于map中.
            g_myMap.insert(ValueType(recvPacket.iExNum,fdSocket.fd_arrayIdea));
            critical_section.Unlock();
            CString str;
            str.Format("the channel is %d has login",recvPacket.iExNum);
            WriteLog("log.txt",str);
           }

          }
        
         }
         else
         {
          
          ::closesocket(fdSocket.fd_arrayIdea);
          FD_CLR(fdSocket.fd_arrayIdea,&fdSocket);

         }
        }
       }
      }
     }
    }
    return 0;

    }

    上面是主要代码.

    此段代码是服务器部分,在服务器不发送数据给客户端的情况下.

    服务器可以正常地接收客户端的连接,并加入到MAP中,且在日志中出现连接成功的记录.

    如果服务器在其它地方发送数据给任一客户端,则服务器不能接受新建的连接,日志中没有任何操作记录.

     

    请问用什么方法可以解决?

    难道要监听写操作?那应该如何在其它地方调用 呢?

     

    2008年8月26日 13:58

答案

全部回复