void connect_manager::init(const char* default_addr, const char* addr_list, size_t count, int conn_timeout /* = 30 */, int rw_timeout /* = 30 */) { if (addr_list != NULL && *addr_list != 0) set_service_list(addr_list, (int) count, conn_timeout, rw_timeout); // 创建缺省服务连接池对象,该对象一同放入总的连接池集群中 if (default_addr != NULL && *default_addr != 0) { logger("default_pool: %s", default_addr); int max = check_addr(default_addr, default_addr_, count); if (max < 0) logger("no default connection set"); else default_pool_ = &set(default_addr_.c_str(), max, conn_timeout, rw_timeout); } else logger("no default connection set"); // 必须保证至少有一个服务可用 if (pools_.empty()) logger_fatal("no connection available!"); }
int doNIT(struct secbuf *sec, void *data) { int ver, len, i; int nw_desc_len, ts_desc_len; uint16_t nw_id; uint8_t *p, *q; struct nit *nit = data; /* TODO: check CRC?, using crc32 module like dvb_net.c? */ if (sec->buf[0] != TID_NIT_SELF || sec->buf[1] & 0xf0 != 0xb0 ) { dprintf(" bad table header.\n"); return 2; } len = (sec->buf[1] & 0x0f) << 8 | sec->buf[2]; nw_id = sec->buf[3] << 8 | sec->buf[4]; ver = (sec->buf[5] & 0x3e0) >> 1; nw_desc_len = (sec->buf[8]&0x0f)<< 8 | sec->buf[9]; if (!(sec->buf[5]&0x01) || sec->buf[6] && nw_desc_len || sec->buf[6] && nw_id != nit->nw_id) { dprintf(" bad section.\n"); return 2; } if (ver != nit->ver) { nit->ver = ver; nit->next_sec = 0; } if (sec->buf[6] < nit->next_sec) { dprintf(" same section[%02hhx] received.\n", sec->buf[6]); return 1; } else if (sec->buf[6] > nit->next_sec) { dprintf(" section[%02hhx] received, expecting [%02x].\n", sec->buf[6], nit->next_sec); return 1; } nit->next_sec++; if (!sec->buf[6]) { nit->nw_id = nw_id; nit->num_ts = 1; nit->ts_info[0].num_service = 0; } p = &sec->buf[10]; i = 0; q = p; while (i < nw_desc_len) { if (q[0] == DESC_CA_EMM_TS) { nit->emm_ts.cas_id = q[2] << 8 | q[3]; nit->emm_ts.ts_id = q[4] << 8 | q[5]; nit->emm_ts.orig_nw_id = q[6] << 8 | q[7]; nit->emm_ts.power_supply_period = q[8]; break; } i += q[1] + 2; q += q[1] + 2; } p += nw_desc_len; p += 2; /* skip ts_loop_len, as it should be fixed to 1 */ nit->ts_info[0].ts_id = p[0]<<8 | p[1]; nit->ts_info[0].orig_nw_id = p[2] << 8 | p[3]; ts_desc_len = (p[4] & 0x0f) << 8 | p[5]; p += 6; dprintf("new NIT nw:%04hx(ver.%02x) ts:%04x desc:%d sec:%hhu/%hhu\n", nw_id, ver, nit->ts_info[0].ts_id, ts_desc_len, sec->buf[6], sec->buf[7]); i = 0; while (i < ts_desc_len) { switch (p[0]) { case DESC_TS_INFO: set_ts_info(p, nit); break; break; case DESC_SERVICE_LIST: set_service_list(p, nit); break; case DESC_PARTIAL_RECV: set_partial_recv(p, nit); break; default: dprintf(" desc[%02hhx](%hhu)\n", p[0], p[1]); } i += p[1]+2; p += p[1]+2; } dprintf("\n"); return 0; }