Example #1
0
File: libskt.c Project: gozfree/src
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;
}
Example #2
0
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;
}