示例#1
0
static rstatus_t
proxy_reuse(struct conn *p)
{
    rstatus_t status;
    struct sockaddr_un *un;

    switch (p->family) {
    case AF_INET:
    case AF_INET6:
        status = nc_set_reuseaddr(p->sd);
        break;

    case AF_UNIX:
        /*
         * bind() will fail if the pathname already exist. So, we call unlink()
         * to delete the pathname, in case it already exists. If it does not
         * exist, unlink() returns error, which we ignore
         */
        un = (struct sockaddr_un *) p->addr;
        unlink(un->sun_path);
        status = NC_OK;
        break;

    default:
        NOT_REACHED();
        status = NC_ERROR;
    }

    return status;
}
示例#2
0
static rstatus_t
stats_listen(struct stats *st)
{
    rstatus_t status;
    struct sockinfo si;

    status = nc_resolve(&st->addr, st->port, &si);
    if (status < 0) {
        return status;
    }

    st->sd = socket(si.family, SOCK_STREAM, 0);
    if (st->sd < 0) {
        log_error("socket failed: %s", strerror(errno));
        return NC_ERROR;
    }

    status = nc_set_reuseaddr(st->sd);
    if (status < 0) {
        log_error("set reuseaddr on m %d failed: %s", st->sd, strerror(errno));
        return NC_ERROR;
    }

    status = bind(st->sd, (struct sockaddr *)&si.addr, si.addrlen);
    if (status < 0) {
        log_error("bind on m %d to addr '%.*s:%u' failed: %s", st->sd,
                  st->addr.len, st->addr.data, st->port, strerror(errno));
        return NC_ERROR;
    }

    status = listen(st->sd, SOMAXCONN);
    if (status < 0) {
        log_error("listen on m %d failed: %s", st->sd, strerror(errno));
        return NC_ERROR;
    }

    log_debug(LOG_NOTICE, "m %d listening on '%.*s:%u'", st->sd,
              st->addr.len, st->addr.data, st->port);

    return NC_OK;
}
示例#3
0
rstatus_t
stats_master_server(uint16_t stats_port, char *stats_ip)
{
    rstatus_t status;
    //struct stats *st;
	struct sockinfo si;
	struct string addr;
	//int sd;
   
	
    string_set_raw(&addr, stats_ip);
    status = nc_resolve(&addr, stats_port, &si);
    if (status < 0) {
        return status;
    }

    nc_stats_listen_sd = socket(si.family, SOCK_STREAM, 0);
    if (nc_stats_listen_sd < 0) {
        log_error("socket failed: %s", strerror(errno));
        return NC_ERROR;
    }

    status = nc_set_reuseaddr(nc_stats_listen_sd);
    if (status < 0) {
        log_error("set reuseaddr on m %d failed: %s", nc_stats_listen_sd, strerror(errno));
        return NC_ERROR;
    }


	pthread_t *ptid = nc_alloc(sizeof(pthread_t));	
	*ptid = (pthread_t) -1;
	
	log_error("master sd %d", nc_stats_listen_sd);
	status = pthread_create(ptid, NULL, stats_master_loop, (void*)(&nc_stats_listen_sd));
	if (status < 0) {
		log_error("stats aggregator create failed: %s", strerror(status));
		return NC_ERROR;
	}
	log_debug(LOG_NOTICE, "pthread stats master create success %d'", status);



    status = bind(nc_stats_listen_sd, (struct sockaddr *)&si.addr, si.addrlen);
    if (status < 0) {
        log_error("bind on m %d to addr '%.*s:%u' failed: %s", nc_stats_listen_sd,
                  addr.len, addr.data, stats_port, strerror(errno));
        return NC_ERROR;
    }

    status = listen(nc_stats_listen_sd, SOMAXCONN);
    if (status < 0) {
        log_error("listen on m %d failed: %s", nc_stats_listen_sd, strerror(errno));
        return NC_ERROR;
    }

    log_debug(LOG_NOTICE, "m %d listening on '%.*s:%u'",nc_stats_listen_sd,
              addr.len, addr.data, stats_port);
	
	

    return NC_OK;
}