fujuntang
2021-08-11 68d23225a38a35f1325eb39fa4ed5a005d5de473
src/socket/bus_server_socket.cpp
@@ -6,7 +6,7 @@
static Logger *logger = LoggerFactory::getLogger();
void BusServerSocket::foreach_subscripters(std::function<void(SHMKeySet *, int)>  cb) {
   SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
   SHMTopicSubMap *topic_sub_map = shm_mm_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
   SHMKeySet *subscripter_set;
   SHMKeySet::iterator set_iter;
   SHMTopicSubMap::iterator map_iter;
@@ -29,7 +29,7 @@
   int key;
   for(int i = 0; i < length; i++) {
      key = keys[i];
      SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
      SHMTopicSubMap *topic_sub_map = shm_mm_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
      SHMKeySet *subscripter_set;
      SHMKeySet::iterator set_iter;
      SHMTopicSubMap::iterator map_iter;
@@ -39,7 +39,6 @@
            subscripter_set = map_iter->second;
            if(subscripter_set != NULL && (set_iter = subscripter_set->find(key) ) != subscripter_set->end()) {
               subscripter_set->erase(set_iter);
// printf("remove_subscripter %s, %d\n", map_iter->first, key);
               count++;
            }
         }
@@ -52,31 +51,13 @@
BusServerSocket::BusServerSocket() {
   logger->debug("BusServerSocket Init");
   shm_socket = shm_open_socket(SHM_SOCKET_DGRAM);
   shm_socket = shm_socket_open(SHM_SOCKET_DGRAM);
   topic_sub_map = NULL;
}
BusServerSocket::~BusServerSocket() {
   SHMKeySet *subscripter_set;
   SHMTopicSubMap::iterator map_iter;
   stop();
   if(topic_sub_map != NULL) {
      for (map_iter = topic_sub_map->begin(); map_iter != topic_sub_map->end(); map_iter++) {
         subscripter_set = map_iter->second;
         if(subscripter_set != NULL) {
            subscripter_set->clear();
            mm_free((void *)subscripter_set);
         }
      }
      topic_sub_map->clear();
      mem_pool_free_by_key(SHM_BUS_MAP_KEY);
   }
   shm_close_socket(shm_socket);
   logger->debug("BusServerSocket destory 3");
   destroy();
}
@@ -97,9 +78,9 @@
 * 启动bus
 * 
 * @return 0 成功, 其他值 失败的错误码
*/
 */
int  BusServerSocket::start(){
   topic_sub_map =   mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
   topic_sub_map =   shm_mm_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
 
   _run_proxy_();
   return 0;
@@ -111,8 +92,6 @@
   if( shm_socket->key <= 0) {
      return -1;
   }
   // snprintf(buf, 128, "%sstop%s%s%s%s", ACTION_LIDENTIFIER, ACTION_RIDENTIFIER, TOPIC_LIDENTIFIER, "", TOPIC_RIDENTIFIER);
   // return shm_sendto(shm_socket, buf, strlen(buf), shm_socket->key, NULL, 0);
   bus_head_t head = {};
   memcpy(head.action, "stop", sizeof(head.action));
   head.topic_size = 0;
@@ -122,13 +101,33 @@
   void *buf;
   int size = ShmModSocket::get_bus_sendbuf(head, NULL, 0, NULL,  0, &buf);
   if(size > 0) {
      ret = client.sendandrecv_unsafe( buf, size, shm_socket->key, NULL, NULL);
      ret = client.sendto( buf, size, shm_socket->key);
      free(buf);
      return ret;
   } else {
      return -1;
   }
}
int  BusServerSocket::destroy() {
   SHMKeySet *subscripter_set;
   SHMTopicSubMap::iterator map_iter;
   if(topic_sub_map != NULL) {
      for (map_iter = topic_sub_map->begin(); map_iter != topic_sub_map->end(); map_iter++) {
         subscripter_set = map_iter->second;
         if(subscripter_set != NULL) {
            subscripter_set->clear();
            mm_free((void *)subscripter_set);
         }
      }
      topic_sub_map->clear();
      shm_mm_free_by_key(SHM_BUS_MAP_KEY);
   }
   shm_socket_close(shm_socket);
   logger->debug("BusServerSocket destory 3");
   return 0;
}
/*
@@ -201,7 +200,6 @@
      subscripter_set = map_iter->second;
      for(set_iter = subscripter_set->begin(); set_iter != subscripter_set->end(); set_iter++) {
         send_key = *set_iter;
// logger->debug("_proxy_pub send before %d \n", send_key);
         rv = shm_sendto(shm_socket, buf, size, send_key, &timeout, BUS_TIMEOUT_FLAG);
         if(rv == 0) {
            continue;
@@ -232,26 +230,28 @@
   char resp_buf[128];
   bus_head_t head;
  int rv;
  char send_buf[512] = { 0x00 };
   const char *topic_delim = ",";
// logger.debug("_run_proxy_ server receive before\n");
   while(shm_recvfrom(shm_socket, (void **)&buf, &size, &key) == 0) {
// logger.debug("_run_proxy_ server recvfrom %d after: %s \n", key, buf);
      head = ShmModSocket::decode_bus_head(buf);
      topics = buf + BUS_HEAD_SIZE;
      action = head.action;
// logger.debug("_run_proxy_ : %s\n", action);
      if(strcmp(action, "sub") == 0) {
         // 订阅支持多主题订阅
         topic = strtok(topics, topic_delim);
// logger.debug("_run_proxy_ topic = %s\n", topic);
        while(topic) {
       _proxy_sub(trim(topic, 0), key);
        topic =  strtok(NULL, topic_delim);
        }
      } 
      else if(strcmp(action, "desub") == 0) {
// logger.debug("desub topic=%s,%s,%d\n", topics, trim(topics, 0), strcmp(trim(topics, 0), ""));
         if(strcmp(trim(topics, 0), "") == 0) {
            // 取消所有订阅
            _proxy_desub_all(key);
@@ -259,6 +259,7 @@
          
            topic = strtok(topics, topic_delim);
           while(topic) {
          _proxy_desub(trim(topic, 0), key);
           topic =  strtok(NULL, topic_delim);
           }
@@ -270,7 +271,16 @@
         _proxy_pub(topics, content, head.content_size, key);
      }  
      else if(strcmp(action, "stop") == 0) {
      else if (strncmp(buf, "request", strlen("request")) == 0) {
      sprintf(send_buf, "%4d", key);
      strncpy(send_buf + 4, buf, (sizeof(send_buf) - 4) >= (strlen(buf) + 1) ? strlen(buf) : (sizeof(send_buf) - 4));
      rv = shm_sendto(shm_socket, send_buf, strlen(send_buf) + 1, key);
      if(rv != 0) {
        logger->error( "BusServerSocket::_run_proxy_ : requst answer fail!\n");
      }
    }
    else if(strcmp(action, "stop") == 0) {
         logger->info( "Stopping Bus...");         
         free(buf);
         break;
@@ -280,8 +290,6 @@
      free(buf);
   }
   shm_sendto(shm_socket, "stop_finished", strlen( "stop_finished") +1, key);
   return NULL;
}