wangzhengquan
2021-01-27 251bbc8b0ebd9a91d34f81186d9284f6e669b4db
update
3个文件已修改
32 ■■■■ 已修改文件
src/socket/bus_server_socket.cpp 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/bus_server_socket.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
test_socket/bus_test.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/bus_server_socket.cpp
@@ -101,7 +101,7 @@
int  BusServerSocket::start(){
    topic_sub_map =    mem_pool_attach<SHMTopicSubMap>(SHM_BUS_MAP_KEY);
 
    run_pubsub_proxy();
    _run_proxy_();
    return 0;
}
@@ -193,19 +193,21 @@
    std::vector<int>::iterator vector_iter;
    int send_key;
    int rv;
    struct timespec timeout = {1,0};
    if( (map_iter = topic_sub_map->find(topic) ) != topic_sub_map->end()) {
        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);
            if (shm_sendto(shm_socket, buf, size, send_key, &timeout, BUS_TIMEOUT_FLAG) == EBUS_CLOSED ) {
                //对方已关闭的连接放到待删除队列里。如果直接删除会让iter指针出现错乱
                subscripter_to_del.push_back(send_key);
            } else {
// logger->debug("_proxy_pub send after: %d \n", send_key);
            rv = shm_sendto(shm_socket, buf, size, send_key, &timeout, BUS_TIMEOUT_FLAG);
            if(rv == 0) {
                continue;
            }
            //对方已关闭的或者对应的进程被kill掉的连接放到待删除队列里。如果直接删除会让iter指针出现错乱
            subscripter_to_del.push_back(send_key);
        }
        // 删除已关闭的端
@@ -220,7 +222,9 @@
    }
}
void * BusServerSocket::run_pubsub_proxy() {
// 运行代理
void * BusServerSocket::_run_proxy_() {
    int size;
    int key;
    char * action, *topic, *topics, *buf, *content;
@@ -229,17 +233,17 @@
    bus_head_t head;
    const char *topic_delim = ",";
// logger.debug("run_pubsub_proxy server receive before\n");
// logger.debug("_run_proxy_ server receive before\n");
    while(shm_recvfrom(shm_socket, (void **)&buf, &size, &key) == 0) {
// logger.debug("run_pubsub_proxy server recvfrom %d after: %s \n", key, buf);
// 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_pubsub_proxy : %s\n", action);
// logger.debug("_run_proxy_ : %s\n", action);
        if(strcmp(action, "sub") == 0) {
            // 订阅支持多主题订阅
            topic = strtok(topics, topic_delim);
// logger.debug("run_pubsub_proxy topic = %s\n", topic);
// logger.debug("_run_proxy_ topic = %s\n", topic);
          while(topic) {
       _proxy_sub(trim(topic, 0), key);
        topic =  strtok(NULL, topic_delim);
@@ -271,7 +275,7 @@
            free(buf);
            break;
        } else {
            logger->error( "BusServerSocket::run_pubsub_proxy : unrecognized action %s", action);
            logger->error( "BusServerSocket::_run_proxy_ : unrecognized action %s", action);
        }
        free(buf);
    }
src/socket/bus_server_socket.h
@@ -29,7 +29,7 @@
private:
    void _proxy_sub( char *topic, int key);
    void _proxy_pub( char *topic, void *buf, size_t size, int key);
    void *run_pubsub_proxy();
    void *_run_proxy_();
    // int parse_pubsub_topic(char *str, size_t size, char **_action, char **_topic, size_t *head_len );
 
    void _proxy_desub( char *topic, int key);
test_socket/bus_test.cpp
@@ -69,10 +69,8 @@
  while (true) {
    //printf("Usage: pub <topic> [content] or sub <topic>\n");
    printf("Can I help you? sub, pub, desub or quit %d\n", i++);
    printf("client 1\n");
    // scanf("%s", action);
    std::cin >> action;
    printf("client 2\n");
    if(strcmp(action, "sub") == 0) {
      printf("Please input topic!\n");
      scanf("%s", topic);