Пример #1
0
void CAccepter::acceptedLounge(SOCKET newsd, const struct sockaddr_in& addr)
{
  SingleLock l(&mutex_);
  l.lock();
  acceptedSockets_.push_back(AcceptItem(newsd, addr));
}
Пример #2
0
//--------------------------------------------------------------------
//----- CommandRecognizing()
//-------- sd - socket descriptor
//--------------------------------------------------------------------
void
CommandRecognizing (int sd)
{
  RD cmd;
  int res, links=0;
  int IsName = 0;
  int IsWorking = 1;		// sign of break or end connection by client
  char ClientName[256];
  struct sockaddr_in addr;
  int addr_size = sizeof (addr);
  c_tree con_tree;
  ClientName[0] = 0;

  int last_error;

  res = getpeername (sd, (struct sockaddr *) &addr, (socklen_t *) & addr_size);
  
  last_error = errno;
  
  if (res != 0)
  {
    fprintf (stderr,"(%d) connector.c getpeername() ERROR(%d)\n", sd, last_error);fflush(stdout);
    return;
  }

  ConnectorsCounter++;
  CreateList (&con_tree);
  while (IsWorking > 0)
  {
    if( WaitNetDataExt(sd,5000) > 0)
    {
      if (STOP_TASK)
      {
        cmd.command = 88;
        break;
      }
      cmd.command = 80;
      IsWorking = recv (sd, &cmd, sizeof (cmd), MSG_WAITALL);
      //	gettimeofday(&tv1, NULL);
      //	printf("(%d)Connector recv: command = %d, work = %d, IsWorking = %d\n", sd, cmd.command, cmd.work, IsWorking);fflush(stdout);
      if (IsWorking > 0)
      {
        switch (cmd.command)
        {
        case GET_UNIT_IDENT_BY_NAME:
          IsWorking = GetUnitIdentByName (sd, cmd.work);
          break;
        case ACCEPT_ITEM:
          IsWorking = AcceptItem (sd, (ident_t) cmd.work);
          break;
        case FREE_ITEM:
          IsWorking = FreeItem (sd, (ident_t) cmd.work);
          break;
        case FREE_EXT_ITEM:
          IsWorking = FreeExtItem (sd, (ident_t) cmd.work, &con_tree);
          break;
        case READ_BY_IDENT:
          IsWorking = ReadByIdent (sd, (ident_t) cmd.work);
          break;
        case WRITE_BY_IDENT:
          IsWorking = WriteByIdent (sd, (ident_t) cmd.work);
          break;
        case END_SESSION:
          IsWorking = EndSession (sd);
          break;
        case READ_ALL:
          IsWorking = ReadAll (sd, &con_tree);
          break;
        case READ_NEW:
          IsWorking = ReadNew (sd, &con_tree);
          break;
        case LINK_ITEM_BY_NAME:
          IsWorking = LinkItem (sd, cmd.work, &con_tree);
          if(IsWorking)
            links++;
          break;
        case BEGIN_SESSION:
          recv (sd, ClientName, cmd.work, MSG_WAITALL);
          IsName = 1;
          break;
        case INIT_DB:
          init_reload();
          IsName = 1;
          fprintf
              (stdout,"<%s> init reload DB [sd=(%d) %s:%d]. Now are %2d clients.\n",
               ClientName[0] ? ClientName : "Unknown", sd,
               inet_ntoa (addr.sin_addr), ntohs (addr.sin_port),
               ConnectorsCounter);

          break;
        case WRITE_MULTIPLE:
          IsWorking = WriteMultiple(sd, cmd.work);
          break;
        default:
          fprintf (stderr,"Unrecognized command %d \n", cmd.command);fflush(stdout);
          break;
        }
        if (IsName < 2)
        {
          fprintf
              (stderr,"<%s> has been connected [sd=(%d) %s:%d]. Now are %2d clients.\n",
               ClientName[0] ? ClientName : "Unknown", sd,
               inet_ntoa (addr.sin_addr), ntohs (addr.sin_port),
               ConnectorsCounter);fflush(stdout);
          IsName = 2;
        }
      }
    }
    else
    {
      fprintf (stderr, "Connector() TIMEOUT\n");fflush(stdout);
      break;
    }
  }
  ClearList (&con_tree);
  res = ServerFreeAll (sd);
  ConnectorsCounter--;
  fprintf
    (stderr,
     "(cmd=%d)(links=%d)<%s> has been disconnected [sd=(%d) %s:%d]. Now are %2d clients.\n",
     cmd.command,links,
     ClientName[0] ? ClientName : "Unknown", sd, inet_ntoa (addr.sin_addr),
     ntohs (addr.sin_port), ConnectorsCounter);fflush(stdout);
}