コード例 #1
0
ファイル: SipperMediaListener.cpp プロジェクト: bklang/sipper
void SipperMediaListener::removeController(int accSock)
{
   MutexGuard(&_mutex);
   _controllerMap.erase(accSock);
   MutexSignal();
   SipperMediaPortable::getTimeOfDay(&_lastActivityTime);              
}
コード例 #2
0
void SipperProxyStatSockAcceptor::_processIncomingConnections()
{
   fd_set read_fds;

   while(true)
   {
      {
         MutexGuard(&_mutex);
         if(_shutdownFlag) return;
      }

      FD_ZERO(&read_fds);
      FD_SET(_sock, &read_fds);

      struct timeval time_out;
      time_out.tv_sec = 1;
      time_out.tv_usec = 0;

      if(select(_sock + 1, &read_fds, NULL, NULL, &time_out) == -1)
      {
         std::string errMsg = SipperProxyPortable::errorString();
         logger.logMsg(ERROR_FLAG, 0, "Error getting socket status. [%s]\n",
                       errMsg.c_str());
         continue;
      }

      if(FD_ISSET(_sock, &read_fds))
      {
         struct sockaddr_in cliAddr;
         memset(&cliAddr, 0, sizeof(cliAddr));

#ifdef __UNIX__
         socklen_t len = sizeof(cliAddr);
#else
         int len = sizeof(cliAddr);
#endif
         int accSock = accept(_sock, (struct sockaddr *)&cliAddr, &len);

         if(accSock == -1)
         {
            std::string errMsg = SipperProxyPortable::errorString();
            logger.logMsg(ERROR_FLAG, 0, "Accept failed for [%d]. [%s]\n",
                   _sock, errMsg.c_str());
            continue;
         }

         logger.logMsg(ALWAYS_FLAG, 0, "Accepted connection Sock[%d] From IP[%s] Port[%d]\n",
                accSock, inet_ntoa(cliAddr.sin_addr),
                ntohs(cliAddr.sin_port));

         SipperProxyPortable::setNonBlocking(accSock);
         SipperProxyPortable::setTcpNoDelay(accSock);

         SipperProxyRefObjHolder<SipperProxyStatDispatcher> holder(new SipperProxyStatSockDispatcher(accSock, _mgr));
      }
   }
}
コード例 #3
0
ファイル: SipperMediaListener.cpp プロジェクト: bklang/sipper
void SipperMediaListener::shutdown()
{   
   logger.logMsg(ALWAYS_FLAG, 0, "Shutdown called on listener. \n");
   MutexGuard(&_mutex);
   _shutdownFlag = true;
   for(SipperMediaControllerMapIt it = _controllerMap.begin(); it != _controllerMap.end(); ++it)
   {
      logger.logMsg(ALWAYS_FLAG, 0, "Shutdown called on controller[%d]. \n", it->first);
      it->second->shutdown();
   }
   return;
}
コード例 #4
0
char_ptr JobQueue_JobQueueServiceImpl::generateJobId () const
{
    MutexGuard(d_->lock_);
    struct timeval tv;
    struct timezone tz;

    gettimeofday(&tv, &tz);
    long secs=tv.tv_sec;
    long usecs=tv.tv_usec;

    char buf[strlen(d_->hostname_.get())+100];
    sprintf(buf, "%s-%d-%ld-%ld", d_->hostname_.get(), d_->pid_, secs, usecs);
    if (strlen(buf) > strlen(d_->hostname_.get())+99)
    {
        PANICV("buffer overflow in JobQueue_JobQueueServiceImpl::generateJobId strlen(%s)=%d", buf, strlen(buf));
    }
    return ptr_strdup(buf);
}
コード例 #5
0
ファイル: SipperProxyConfig.cpp プロジェクト: bklang/sipper
std::string SipperProxyConfig::getConfig(const std::string &section, 
                               const std::string &paramName, 
                               const std::string &defaultValue)
{
   std::string ret;

   {
      MutexGuard(&_mutex);

      SectionMapIt it;
      if(section == "")
      {
         it = _sectionConfig.find("Global");
      }
      else
      {
         it = _sectionConfig.find(section);
      }

      if(it == _sectionConfig.end())
      {
         ret = defaultValue;
      }
      else
      {
         ConfigMap &currconfig = it->second;
         ConfigMapIt cit = currconfig.find(paramName);

         if(cit == currconfig.end())
         {
            ret = defaultValue;
         }
         else
         {
            ret = cit->second;
         }
      }
   }

   return ret;
}
コード例 #6
0
ファイル: SipperMediaListener.cpp プロジェクト: bklang/sipper
void SipperMediaListener::addController(int accSock, SipperMediaController *controller)
{
   MutexGuard(&_mutex);
   _controllerMap[accSock] = controller;
   SipperMediaPortable::getTimeOfDay(&_lastActivityTime);              
}
コード例 #7
0
ファイル: SipperMediaListener.cpp プロジェクト: bklang/sipper
int SipperMediaListener::startListener(unsigned short port)
{
#ifndef __UNIX__
   WSADATA wsaData;
   int iResult;

   iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
   if (iResult != 0) 
   {
      logger.logMsg(ERROR_FLAG, 0, "WSAStartup failed: %d\n", iResult);
      exit(1);
   }
#endif

   SipperMediaConfig &config = SipperMediaConfig::getInstance();
   int inActiveDuration = atoi(config.getConfig("Global", "InActiveDuration", "300").c_str());

   if(inActiveDuration < 0)
   {
      logger.logMsg(ERROR_FLAG, 0, "InActiveTimer is -ve. Using default Value\n");
      inActiveDuration = 300;
   }

   _shutdownFlag = false;
   int sock = socket(AF_INET, SOCK_STREAM, 0);

   u_int flagOn = 1;
#ifndef __UNIX__
   setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&flagOn, sizeof(flagOn));
#else
   setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flagOn, sizeof(flagOn));
#endif

   sockaddr_in svrInfo;
   memset(&svrInfo, 0, sizeof(sockaddr_in));

   svrInfo.sin_family = AF_INET;
   svrInfo.sin_addr.s_addr = INADDR_ANY;
   svrInfo.sin_port = htons(port);

   if(bind(sock, (struct sockaddr *)&svrInfo, sizeof(sockaddr_in)) == -1)
   {
      logger.logMsg(ERROR_FLAG, 0, "Unable to bind to Port[%d] Error[%s].\n",
             port, SipperMediaListener::errorString().c_str());
      SipperMediaListener::disconnectSocket(sock);
      return -1;
   }

   if(listen(sock, 5) == -1)
   {
      logger.logMsg(ERROR_FLAG, 0, "Listen call failed for Port[%d] Error[%s].\n",
        port, SipperMediaListener::errorString().c_str());
      SipperMediaListener::disconnectSocket(sock);
      return -2;
   }

   SipperMediaListener::setNonBlocking(sock);
   SipperMediaListener::setTcpNoDelay(sock);

   fd_set read_fds;

   while(true)
   {
      FD_ZERO(&read_fds);
      FD_SET(sock, &read_fds);

      if(inActiveDuration > 0)
      {
         MutexGuard(&_mutex);
         struct timeval currtime;
         SipperMediaPortable::getTimeOfDay(&currtime);

         if(currtime.tv_sec > (_lastActivityTime.tv_sec + inActiveDuration))
         {
            if(_controllerMap.size() == 0)
            {
               logger.logMsg(ALWAYS_FLAG, 0, "Shutdown on inActivity.");
               _shutdownFlag = true;
               break;
            }
         }
      }

      struct timeval time_out;
      time_out.tv_sec = 1;
      time_out.tv_usec = 0;

      if(select(sock + 1, &read_fds, NULL, NULL, &time_out) == -1)
      {
         std::string errMsg = SipperMediaListener::errorString();
         logger.logMsg(ERROR_FLAG, 0, "Error getting socket status. [%s]\n",
                       errMsg.c_str());
         continue;
      }

      if(_shutdownFlag)
      {
         break;
      }

      if(FD_ISSET(sock, &read_fds))
      {
         struct sockaddr_in cliAddr;
         memset(&cliAddr, 0, sizeof(cliAddr));

#ifdef __UNIX__
         socklen_t len = sizeof(cliAddr);
#else
         int len = sizeof(cliAddr);
#endif
         int accSock = accept(sock, (struct sockaddr *)&cliAddr, &len);

         if(accSock == -1)
         {
            std::string errMsg = SipperMediaListener::errorString();
            logger.logMsg(ERROR_FLAG, 0, "Accept failed for [%d]. [%s]\n",
                   sock, errMsg.c_str());
            continue;
         }

         logger.logMsg(ALWAYS_FLAG, 0, "Accepted connection Sock[%d] From IP[%s] Port[%d]\n",
                accSock, inet_ntoa(cliAddr.sin_addr), 
                ntohs(cliAddr.sin_port));

         SipperMediaListener::setNonBlocking(accSock);
         SipperMediaListener::setTcpNoDelay(accSock);

         {
            MutexGuard(&_mutex);
            SipperMediaPortable::getTimeOfDay(&_lastActivityTime);              
         }

         pthread_t currthread;

         SipperMediaListenerThreadData *thrData = new SipperMediaListenerThreadData;
         thrData->listener = this;
         thrData->socket = accSock;

         pthread_create(&currthread, NULL, SipperMediaListener::_startControllerThread, (void *)thrData);
      }
   }

   SipperMediaListener::disconnectSocket(sock);

   this->shutdown();

   {
      MutexGuard(&_mutex);
      while(_controllerMap.size() > 0)
      {
        logger.logMsg(ALWAYS_FLAG, 0, "Waiting for [%d] controllers to exit.\n", _controllerMap.size());
         MutexWait(1000);
      }
   }

#ifndef __UNIX__
   Sleep(100);
#else
   sleep(1);
#endif
   logger.logMsg(ALWAYS_FLAG, 0, "Listener ended.\n");
   return 0;
}
コード例 #8
0
ファイル: SipperProxyConfig.cpp プロジェクト: bklang/sipper
void SipperProxyConfig::loadConfigFile(const std::string &configFile)
{
   MutexGuard(&_mutex);

   FILE *fp = fopen(configFile.c_str(), "r");

   if(fp == NULL)
   {
      return;
   }

   std::string section = "Global";

   char data[201]; data[200] = '\0';
   while(fgets(data, 200, fp) != NULL)
   {
      int len = strlen(data);

      while((len > 0) && ((data[len - 1] == '\r') || (data[len - 1] == '\n')))
      {
         len--;
         data[len] = '\0';
      }
      
      if(data[0] == '#')
      {
         continue;
      }

      if(data[0] == '[')
      {
         char *start = data + 1;
         while((*start != '\0') && (*start == ' '))
         {
            start++;
         }

         if(*start == '\0') continue;

         char *end = strstr(data + 1, "]");
         if(end == NULL)
         {
            continue;
         }

         *end = '\0';
         end--;
         while((end > start) && (*end == ' '))
         {
            *end = '\0';
            end--;
         }

         if(end == start) continue;
         section = start;

         logger.logMsg(TRACE_FLAG, 0, 
                       "Section [%s]\n", section.c_str());

         continue;
      }

      char *paramName = data;
      while(*paramName == ' ') paramName++;

      char *end = strstr(paramName, "=");
      if(end == NULL) continue;
      char *paramValue = end + 1;

      *end = '\0'; end--;
      while((end > paramName) && (*end == ' '))
      {
         *end = '\0';
         end--;
      }

      if(*paramName == '\0') continue;

      while(*paramValue == ' ') paramValue++;
      end = paramValue;

      while(*end != '\0' && *end != ' ')
      {
         end++;
      }

      if(*end == ' ') *end = '\0';
      _sectionConfig[section][paramName] = paramValue;

      logger.logMsg(ALWAYS_FLAG, 0, 
                    "Section[%s] Name[%s] Value[%s]\n", 
                    section.c_str(), paramName, paramValue);
   }

   fclose(fp);
}