| | |
| | | static Logger *logger = LoggerFactory::getLogger(); |
| | | |
| | | void BusServerSocket::foreach_subscripters(std::function<void(SHMKeySet *, int)> cb) { |
| | | SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(BUS_MAP_KEY); |
| | | SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY); |
| | | SHMKeySet *subscripter_set; |
| | | SHMKeySet::iterator set_iter; |
| | | SHMTopicSubMap::iterator map_iter; |
| | |
| | | int key; |
| | | for(int i = 0; i < length; i++) { |
| | | key = keys[i]; |
| | | SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(BUS_MAP_KEY); |
| | | SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY); |
| | | SHMKeySet *subscripter_set; |
| | | SHMKeySet::iterator set_iter; |
| | | SHMTopicSubMap::iterator map_iter; |
| | |
| | | |
| | | } |
| | | topic_sub_map->clear(); |
| | | mem_pool_free_by_key(BUS_MAP_KEY); |
| | | mem_pool_free_by_key(SHM_BUS_MAP_KEY); |
| | | } |
| | | shm_close_socket(shm_socket); |
| | | logger->debug("BusServerSocket destory 3"); |
| | |
| | | * @return 0 成功, 其他值 失败的错误码 |
| | | */ |
| | | int BusServerSocket::start(){ |
| | | topic_sub_map = mem_pool_attach<SHMTopicSubMap>(BUS_MAP_KEY); |
| | | topic_sub_map = mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY); |
| | | |
| | | run_pubsub_proxy(); |
| | | // 进程停止的时候,预留3秒资源回收的时间。否则,会发生调用close的时候,共享内存的资源还没来得及回收进程就退出了 |
| | |
| | | subscripter_set = map_iter->second; |
| | | for(set_iter = subscripter_set->begin(); set_iter != subscripter_set->end(); set_iter++) { |
| | | send_key = *set_iter; |
| | | // printf("_proxy_pub send before %d \n", send_key); |
| | | printf("_proxy_pub send before %d \n", send_key); |
| | | if (shm_sendto(shm_socket, buf, size, send_key, &timeout) == EBUS_CLOSED ) { |
| | | //对方已关闭的连接放到待删除队列里。如果直接删除会让iter指针出现错乱 |
| | | subscripter_to_del.push_back(send_key); |
| | | } else { |
| | | // printf("_proxy_pub send after: %d \n", send_key); |
| | | printf("_proxy_pub send after: %d \n", send_key); |
| | | } |
| | | |
| | | |
| | |
| | | const char *topic_delim = ","; |
| | | // printf("run_pubsub_proxy server receive before\n"); |
| | | while(shm_recvfrom(shm_socket, (void **)&buf, &size, &key) == 0) { |
| | | //printf("run_pubsub_proxy server recv after: %s \n", buf); |
| | | printf("run_pubsub_proxy server recvfrom %d after: %s \n", key, buf); |
| | | head = ShmModSocket::decode_bus_head(buf); |
| | | topics = buf + BUS_HEAD_SIZE; |
| | | action = head.action; |
| | | // printf("run_pubsub_proxy : %s, %s \n", action, topics); |
| | | printf("run_pubsub_proxy : %s, %s \n", action, topics); |
| | | if(strcmp(action, "sub") == 0) { |
| | | // 订阅支持多主题订阅 |
| | | topic = strtok(topics, topic_delim); |
| | | //printf("run_pubsub_proxy topic = %s\n", topic); |
| | | printf("run_pubsub_proxy topic = %s\n", topic); |
| | | while(topic) { |
| | | _proxy_sub(trim(topic, 0), key); |
| | | topic = strtok(NULL, topic_delim); |
| | |
| | | |
| | | |
| | | |
| | | /** |
| | | * deprecate |
| | | * @str "<**sub**>{经济}" |
| | | */ |
| | | // /** |
| | | // * deprecate |
| | | // * @str "<**sub**>{经济}" |
| | | // */ |
| | | |
| | | int BusServerSocket::parse_pubsub_topic(char *str, size_t size, char **_action, char **_topic, size_t *head_len ) { |
| | | char *ptr = str; |
| | | char *str_end_ptr = str + size; |
| | | char *action_start_ptr; |
| | | char *action_end_ptr; |
| | | size_t action_len = 0; |
| | | // int BusServerSocket::parse_pubsub_topic(char *str, size_t size, char **_action, char **_topic, size_t *head_len ) { |
| | | // char *ptr = str; |
| | | // char *str_end_ptr = str + size; |
| | | // char *action_start_ptr; |
| | | // char *action_end_ptr; |
| | | // size_t action_len = 0; |
| | | |
| | | char *topic_start_ptr; |
| | | char *topic_end_ptr; |
| | | size_t topic_len = 0; |
| | | // char *topic_start_ptr; |
| | | // char *topic_end_ptr; |
| | | // size_t topic_len = 0; |
| | | |
| | | // if (strlen(identifier) > strlen(str)) { |
| | | // return 0; |
| | | // } |
| | | // // if (strlen(identifier) > strlen(str)) { |
| | | // // return 0; |
| | | // // } |
| | | |
| | | if (strncmp(ptr, ACTION_LIDENTIFIER, strlen(ACTION_LIDENTIFIER)) == 0) { |
| | | ptr += strlen(ACTION_LIDENTIFIER); |
| | | action_start_ptr = ptr; |
| | | while(strncmp(++ptr, ACTION_RIDENTIFIER, strlen(ACTION_RIDENTIFIER)) != 0) { |
| | | if(ptr >= str_end_ptr) { |
| | | return 0; |
| | | } |
| | | } |
| | | // printf("%s\n", ptr); |
| | | action_end_ptr = ptr; |
| | | action_len = action_end_ptr - action_start_ptr; |
| | | ptr += strlen(ACTION_RIDENTIFIER); |
| | | // printf("%s\n", ptr); |
| | | // printf("%s\n", str_end_ptr-1); |
| | | if(strncmp(ptr, TOPIC_LIDENTIFIER, strlen(TOPIC_LIDENTIFIER)) == 0 ) { |
| | | topic_start_ptr = ptr+strlen(TOPIC_LIDENTIFIER); |
| | | // if (strncmp(ptr, ACTION_LIDENTIFIER, strlen(ACTION_LIDENTIFIER)) == 0) { |
| | | // ptr += strlen(ACTION_LIDENTIFIER); |
| | | // action_start_ptr = ptr; |
| | | // while(strncmp(++ptr, ACTION_RIDENTIFIER, strlen(ACTION_RIDENTIFIER)) != 0) { |
| | | // if(ptr >= str_end_ptr) { |
| | | // return 0; |
| | | // } |
| | | // } |
| | | // // printf("%s\n", ptr); |
| | | // action_end_ptr = ptr; |
| | | // action_len = action_end_ptr - action_start_ptr; |
| | | // ptr += strlen(ACTION_RIDENTIFIER); |
| | | // // printf("%s\n", ptr); |
| | | // // printf("%s\n", str_end_ptr-1); |
| | | // if(strncmp(ptr, TOPIC_LIDENTIFIER, strlen(TOPIC_LIDENTIFIER)) == 0 ) { |
| | | // topic_start_ptr = ptr+strlen(TOPIC_LIDENTIFIER); |
| | | |
| | | |
| | | while(strncmp(++ptr, TOPIC_RIDENTIFIER, strlen(TOPIC_RIDENTIFIER)) != 0) { |
| | | if(ptr >= str_end_ptr) { |
| | | return 0; |
| | | } |
| | | } |
| | | topic_end_ptr = ptr; |
| | | topic_len = topic_end_ptr - topic_start_ptr; |
| | | // while(strncmp(++ptr, TOPIC_RIDENTIFIER, strlen(TOPIC_RIDENTIFIER)) != 0) { |
| | | // if(ptr >= str_end_ptr) { |
| | | // return 0; |
| | | // } |
| | | // } |
| | | // topic_end_ptr = ptr; |
| | | // topic_len = topic_end_ptr - topic_start_ptr; |
| | | |
| | | ptr += strlen(TOPIC_RIDENTIFIER); |
| | | // ptr += strlen(TOPIC_RIDENTIFIER); |
| | | |
| | | } else { |
| | | return 0; |
| | | } |
| | | } else { |
| | | return 0; |
| | | } |
| | | // } else { |
| | | // return 0; |
| | | // } |
| | | // } else { |
| | | // return 0; |
| | | // } |
| | | |
| | | char *topic = (char *)malloc(topic_len+1); |
| | | strncpy(topic, topic_start_ptr, topic_len); |
| | | *(topic+topic_len) = '\0'; |
| | | *_topic = topic; |
| | | // char *topic = (char *)malloc(topic_len+1); |
| | | // strncpy(topic, topic_start_ptr, topic_len); |
| | | // *(topic+topic_len) = '\0'; |
| | | // *_topic = topic; |
| | | |
| | | char *action = (char *)malloc(action_len+1); |
| | | strncpy(action, action_start_ptr, action_len); |
| | | *(action+action_len) = '\0'; |
| | | *_action = action; |
| | | *head_len = ptr-str; |
| | | // char *action = (char *)malloc(action_len+1); |
| | | // strncpy(action, action_start_ptr, action_len); |
| | | // *(action+action_len) = '\0'; |
| | | // *_action = action; |
| | | // *head_len = ptr-str; |
| | | |
| | | return 1; |
| | | } |
| | | // return 1; |
| | | // } |