static struct skt_connection *_skt_connect(int type, const char *host, uint16_t port) { int domain = AF_INET; int protocol = 0; struct sockaddr_in si; struct skt_connection *sc = NULL; if (type < 0 || strlen(host) == 0 || port >= 0xFFFF) { skt_log(LOG_ERR, "invalid paraments\n"); return NULL; } sc = (struct skt_connection *)calloc(1, sizeof(struct skt_connection)); if (sc == NULL) { skt_log(LOG_ERR, "malloc failed!\n"); return NULL; } sc->fd = socket(domain, type, protocol); if (-1 == sc->fd) { skt_log(LOG_ERR, "socket: %s\n", strerror(errno)); goto fail; } #if 0 si.sin_family = domain; si.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1"); si.sin_port = htons(0); if (-1 == bind(sc->fd, (struct sockaddr*)&si, sizeof(si))) { skt_log(LOG_ERR, "bind: %s\n", strerror(errno)); goto fail; } #endif si.sin_family = domain; si.sin_addr.s_addr = inet_addr(host); si.sin_port = htons(port); if (-1 == connect(sc->fd, (struct sockaddr*)&si, sizeof(si))) { skt_log(LOG_ERR, "connect failed: %s\n", strerror(errno)); goto fail; } sc->remote.ip = inet_addr(host); sc->remote.port = port; sc->type = type; if (-1 == skt_getaddr_by_fd(sc->fd, &sc->local)) { skt_log(LOG_ERR, "skt_getaddr_by_fd failed: %s\n", strerror(errno)); goto fail; } return sc; fail: if (-1 != sc->fd) { close(sc->fd); } if (sc) { free(sc); } return NULL; }
struct p2p *p2p_init(const char *rpc_srv, const char *stun_srv) { char ip[64]; struct skt_addr tmpaddr; static stun_addr _mapped; struct p2p *p2p = CALLOC(1, struct p2p); if (!p2p) { loge("malloc failed: %d\n", errno); return NULL; } p2p->rpc = rpc_create(rpc_srv, _rpc_port); if (!p2p->rpc) { loge("rpc_create failed\n"); return NULL; } RPC_REGISTER_MSG_MAP(BASIC_RPC_API_RESP); rpc_set_cb(p2p->rpc, on_rpc_read, on_rpc_write, on_rpc_error, p2p); skt_getaddr_by_fd(p2p->rpc->fd, &tmpaddr); skt_addr_ntop(_local_ip, tmpaddr.ip); //_local_port = tmpaddr.port; //logi("_local_port = %d\n", _local_port); stun_init(stun_srv); p2p->nat.type = stun_nat_type(); p2p->nat.uuid = p2p->rpc->send_pkt.header.uuid_src; p2p->nat.local.ip = skt_addr_pton(_local_ip); _local_port = random_port(); p2p->nat.local.port = _local_port; p2p->nat.fd = stun_socket(_local_ip, _local_port, &_mapped); _mapped.addr = ntohl(_mapped.addr); skt_addr_ntop(ip, _mapped.addr); p2p->nat.reflect.ip = _mapped.addr; p2p->nat.reflect.port = _mapped.port; logi("get nat info from local\n"); logi("nat.type = %d\n", p2p->nat.type); logi("nat.local_addr %s:%d\n", _local_ip, p2p->nat.local.port); logi("nat.reflect_addr %s:%d\n", ip, p2p->nat.reflect.port); p2p->rpc_state = P2P_RPC_INIT; _p2p = p2p; return p2p; }