예제 #1
0
static apt_bool_t mrcp_server_agent_listen_socket_create(mrcp_connection_agent_t *agent)
{
	apr_status_t status;
	if(!agent->sockaddr) {
		return FALSE;
	}

	/* create listening socket */
	status = apr_socket_create(&agent->listen_sock, agent->sockaddr->family, SOCK_STREAM, APR_PROTO_TCP, agent->pool);
	if(status != APR_SUCCESS) {
		return FALSE;
	}

	apr_socket_opt_set(agent->listen_sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(agent->listen_sock, -1);
	apr_socket_opt_set(agent->listen_sock, APR_SO_REUSEADDR, 1);

	status = apr_socket_bind(agent->listen_sock, agent->sockaddr);
	if(status != APR_SUCCESS) {
		apr_socket_close(agent->listen_sock);
		agent->listen_sock = NULL;
		return FALSE;
	}
	status = apr_socket_listen(agent->listen_sock, SOMAXCONN);
	if(status != APR_SUCCESS) {
		apr_socket_close(agent->listen_sock);
		agent->listen_sock = NULL;
		return FALSE;
	}

	return TRUE;
}
예제 #2
0
파일: server.c 프로젝트: Abioy/mpaxos
void server_bind_listen(server_t *svr) {
    apr_sockaddr_info_get(&svr->comm->sa, NULL, APR_INET, 
			  svr->comm->port, 0, svr->comm->mp);
/*
    apr_socket_create(&r->s, r->sa->family, SOCK_DGRAM, APR_PROTO_UDP, r->pl_recv);
*/
    apr_socket_create(&svr->comm->s, svr->comm->sa->family, 
		      SOCK_STREAM, APR_PROTO_TCP, svr->comm->mp);
    apr_socket_opt_set(svr->comm->s, APR_SO_NONBLOCK, 1);
    apr_socket_timeout_set(svr->comm->s, -1);
    /* this is useful for a server(socket listening) process */
    apr_socket_opt_set(svr->comm->s, APR_SO_REUSEADDR, 1);
    apr_socket_opt_set(svr->comm->s, APR_TCP_NODELAY, 1);
    
    apr_status_t status = APR_SUCCESS;
    status = apr_socket_bind(svr->comm->s, svr->comm->sa);
    if (status != APR_SUCCESS) {
        LOG_ERROR("cannot bind.");
        printf("%s", apr_strerror(status, malloc(100), 100));
        SAFE_ASSERT(status == APR_SUCCESS);
    }
    status = apr_socket_listen(svr->comm->s, 30000); // This is important!
    if (status != APR_SUCCESS) {
        LOG_ERROR("cannot listen.");
        printf("%s", apr_strerror(status, malloc(100), 100));
        SAFE_ASSERT(status == APR_SUCCESS);
    }
    LOG_INFO("successfuly bind and listen on port %d.", svr->comm->port);
}
예제 #3
0
int sock_bind(net_sock_t *nsock, char *address, int port)
{
    int err;
    network_sock_t *sock = (network_sock_t *)nsock;

    if (sock == NULL) return(1);

    log_printf(10, "sock_bind: host=%s:%d\n", address, port);

//   err = apr_sockaddr_info_get(&(sock->sa), address, APR_INET, port, APR_IPV4_ADDR_OK, sock->mpool);
    err = apr_sockaddr_info_get(&(sock->sa), address, APR_INET, port, 0, sock->mpool);
//log_printf(10, "sock_bind: apr_sockaddr_info_get=%d APR_SUCCESS=%d\n", err, APR_SUCCESS);
    if (err != APR_SUCCESS) return(err);

    err = apr_socket_create(&(sock->fd), APR_INET, SOCK_STREAM, APR_PROTO_TCP, sock->mpool);
//log_printf(10, "sock_bind: apr_socket_create=%d APR_SUCCESS=%d\n", err, APR_SUCCESS);
    if (err != APR_SUCCESS) return(err);

    apr_socket_opt_set(sock->fd, APR_SO_NONBLOCK, 1);
    apr_socket_opt_set(sock->fd, APR_SO_REUSEADDR, 1);
//log_printf(10, "sock_bind: apr_socket_opt_set=%d APR_SUCCESS=%d\n", err, APR_SUCCESS);
    if (sock->tcpsize > 0) {
        apr_socket_opt_set(sock->fd, APR_SO_SNDBUF, sock->tcpsize);
        apr_socket_opt_set(sock->fd, APR_SO_RCVBUF, sock->tcpsize);
    }

    err = apr_socket_bind(sock->fd, sock->sa);
    log_printf(10, "sock_bind: apr_socket_bind=%d APR_SUCCESS=%d\n", err, APR_SUCCESS);

    return(err);
}
예제 #4
0
/**
 * Create a listening socket, and listen it.
 */
static apr_status_t do_listen(apr_socket_t **sock, apr_pool_t *mp, int port)
{
    apr_status_t rv;
    apr_socket_t *s;
    apr_sockaddr_t *sa;
    
    rv = apr_sockaddr_info_get(&sa, NULL, APR_INET, port, 0, mp);
    if (rv != APR_SUCCESS) {
        return rv;
    }
    
    rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp);
    if (rv != APR_SUCCESS) {
        return rv;
    }

    /* it is a good idea to specify socket options explicitly.
     * in this case, we make a blocking socket as the listening socket */
    apr_socket_opt_set(s, APR_SO_NONBLOCK, 0);
    apr_socket_timeout_set(s, 100);
    apr_socket_opt_set(s, APR_SO_REUSEADDR, 1);/* this is useful for a server(socket listening) process */

    rv = apr_socket_bind(s, sa);
    if (rv != APR_SUCCESS) {
        return rv;
    }
    rv = apr_socket_listen(s, DEF_SOCKET_BACKLOG);
    if (rv != APR_SUCCESS) {
        return rv;
    }

    *sock = s;
    return rv;
}
예제 #5
0
static apr_socket_t* mpf_socket_create(apr_sockaddr_t **l_sockaddr, const char *ip, apr_port_t port, apr_pool_t *pool)
{
	apr_socket_t *socket = NULL;
	*l_sockaddr = NULL;
	apr_sockaddr_info_get(
		l_sockaddr,
		ip,
		APR_INET,
		port,
		0,
		pool);
	if(!*l_sockaddr) {
		apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Failed to Get Sockaddr %s:%hu",ip,port);
		return NULL;
	}
	if(apr_socket_create(&socket,(*l_sockaddr)->family,SOCK_DGRAM,0,pool) != APR_SUCCESS) {
		apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Failed to Create Socket %s:%hu", ip,port);
		return NULL;
	}
	
	apr_socket_opt_set(socket,APR_SO_NONBLOCK,1);
	apr_socket_timeout_set(socket,0);
	apr_socket_opt_set(socket,APR_SO_REUSEADDR,1);

	if(apr_socket_bind(socket,*l_sockaddr) != APR_SUCCESS) {
		apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Failed to Bind Socket to %s:%hu", ip,port);
		apr_socket_close(socket);
		return NULL;
	}
	return socket;
}
예제 #6
0
파일: server.c 프로젝트: EvaIPDBG/IPDBG
static apr_socket_t* create_listen_sock(apr_pool_t *mp, unsigned short channel)
{
    apr_status_t rv;
    apr_socket_t *s;
    apr_sockaddr_t *sa;

    rv = apr_sockaddr_info_get(&sa, NULL, APR_INET, DEF_LISTEN_PORT+channel, 0, mp); // Create apr_sockaddr_t from hostname, address family, and port.
    if (rv != APR_SUCCESS)
        return NULL;

    rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp); //CREATE A SOCKET
    if (rv != APR_SUCCESS)
        return NULL;

    /* non-blocking socket */
    apr_socket_opt_set(s, APR_SO_NONBLOCK, 1); //Setup socket options for the specified socke

    apr_socket_timeout_set(s, 0); //Setup socket timeout for the specified socket
    apr_socket_opt_set(s, APR_SO_REUSEADDR, 1);/* this is useful for a server(socket listening) process */

    rv = apr_socket_bind(s, sa); //Bind the socket to its associated port
    if (rv != APR_SUCCESS)
        return NULL;

    rv = apr_socket_listen(s, DEF_SOCKET_BACKLOG); //Listen to a bound socket for connections.
    if (rv != APR_SUCCESS)
        return NULL;

    return s;
}
예제 #7
0
static void corkable(CuTest *tc)
{
#if !APR_HAVE_CORKABLE_TCP
    CuNotImpl(tc, "TCP isn't corkable");
#else
    apr_status_t rv;
    apr_int32_t ck;

    rv = apr_socket_opt_set(sock, APR_TCP_NODELAY, 1);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);

    rv = apr_socket_opt_get(sock, APR_TCP_NODELAY, &ck);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);
    CuAssertIntEquals(tc, 1, ck);

    rv = apr_socket_opt_set(sock, APR_TCP_NOPUSH, 1);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);

    rv = apr_socket_opt_get(sock, APR_TCP_NOPUSH, &ck);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);
    CuAssertIntEquals(tc, 1, ck);

    rv = apr_socket_opt_get(sock, APR_TCP_NODELAY, &ck);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);
    CuAssertIntEquals(tc, 0, ck);

    rv = apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);

    rv = apr_socket_opt_get(sock, APR_TCP_NODELAY, &ck);
    CuAssertIntEquals(tc, APR_SUCCESS, rv);
    CuAssertIntEquals(tc, 1, ck);
#endif
}
예제 #8
0
apr_status_t jxr_get_request_if_any(jaxer_connection *ac, char** pbuf)
{
	apr_status_t rv = APR_SUCCESS;
	request_rec *r = ac->request;
	server_rec *main_server = r->server;
	apr_socket_t *sock = ac->sock;
	struct timeval tv;

	fd_set fdread;
	int rc;

	*pbuf = 0;
	
	rv = apr_socket_opt_set(sock, APR_SO_NONBLOCK, 1);
	if (rv != APR_SUCCESS)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, "mod_jaxer: turn on non-blocking failed");
		ac->has_error = 1;
		return rv;
	}

	tv.tv_sec = 0;
	tv.tv_usec = 0;
	
	FD_ZERO(&fdread);
	FD_SET(((partial_apr_socket_t*)sock)->socketdes, &fdread);
			
	rc = select(1+ (int)((partial_apr_socket_t*)sock)->socketdes, &fdread, NULL, NULL, &tv);
	if (rc < 0)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rc, r, "mod_jaxer: socket select failed");
		ac->has_error = 1;
		return rc;
	}
	
	
	/* turn off non-blocking */
	rv = apr_socket_opt_set(sock, APR_SO_NONBLOCK, 0);
	if (rv != APR_SUCCESS)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, "mod_jaxer: turn off non-blocking failed");
		return rv;
	}

	/* return if nothing */
	if (rc == 0)
		return rv;


	/* 
	 * Since we have only one socket, we know we have data for reading if we are here.
	 * read a message
	 */
	if ((rv=jxr_receive_message(ac, (unsigned char **)pbuf)) != APR_SUCCESS)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, "mod_jaxer: receive message failed");
		return rv;
	}
	return rv;
}
예제 #9
0
/** Wrapper for socketpair. */
int kdsock_comm_new_socketpair(apr_pool_t *pool1, kdsock_comm **comm1, 
                               apr_pool_t *pool2, kdsock_comm **comm2,
                               int auto_shutdown) {
    int fd[2] = {-1, -1};

    /* Create a pair of socket for communicating with the child. */
    if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) {
        KERROR_SET(_server_, 0, "failed to create child communication socket");
        return -1;
    }

    /* Circumvent a kernel 2.6.22 bug.  Check if the file descriptors
       were actually set to something. */
    if (fd[0] == -1 || fd[1] == -1) {
        KERROR_SET(_server_, 0, "socketpair returned no file descriptors");
        return -1;
    }
    
    /* Create the communication objects. */
    *comm1 = kdsock_comm_new(pool1, fd[0], auto_shutdown);
    *comm2 = kdsock_comm_new(pool2, fd[1], auto_shutdown);

    apr_socket_opt_set((*comm1)->apr_sock, APR_SO_NONBLOCK, 1);
    apr_socket_opt_set((*comm2)->apr_sock, APR_SO_NONBLOCK, 1);
    
    return 0;
}
예제 #10
0
void LLSocket::setOptions()
{
	LLMemType m1(LLMemType::MTYPE_IO_TCP);
	// set up the socket options
	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));

}
예제 #11
0
static mrcp_connection_t* mrcp_client_agent_connection_create(mrcp_connection_agent_t *agent, mrcp_control_descriptor_t *descriptor)
{
	char *local_ip = NULL;
	char *remote_ip = NULL;
	mrcp_connection_t *connection = mrcp_connection_create();

	apr_sockaddr_info_get(&connection->r_sockaddr,descriptor->ip.buf,APR_INET,descriptor->port,0,connection->pool);
	if(!connection->r_sockaddr) {
		mrcp_connection_destroy(connection);
		return NULL;
	}

	if(apr_socket_create(&connection->sock,connection->r_sockaddr->family,SOCK_STREAM,APR_PROTO_TCP,connection->pool) != APR_SUCCESS) {
		mrcp_connection_destroy(connection);
		return NULL;
	}

	apr_socket_opt_set(connection->sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(connection->sock, -1);
	apr_socket_opt_set(connection->sock, APR_SO_REUSEADDR, 1);

	if(apr_socket_connect(connection->sock, connection->r_sockaddr) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		mrcp_connection_destroy(connection);
		return NULL;
	}

	if(apr_socket_addr_get(&connection->l_sockaddr,APR_LOCAL,connection->sock) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		mrcp_connection_destroy(connection);
		return NULL;
	}

	apr_sockaddr_ip_get(&local_ip,connection->l_sockaddr);
	apr_sockaddr_ip_get(&remote_ip,connection->r_sockaddr);
	connection->id = apr_psprintf(connection->pool,"%s:%hu <-> %s:%hu",
		local_ip,connection->l_sockaddr->port,
		remote_ip,connection->r_sockaddr->port);

	memset(&connection->sock_pfd,0,sizeof(apr_pollfd_t));
	connection->sock_pfd.desc_type = APR_POLL_SOCKET;
	connection->sock_pfd.reqevents = APR_POLLIN;
	connection->sock_pfd.desc.s = connection->sock;
	connection->sock_pfd.client_data = connection;
	if(apt_pollset_add(agent->pollset, &connection->sock_pfd) != TRUE) {
		apr_socket_close(connection->sock);
		mrcp_connection_destroy(connection);
		return NULL;
	}
	
	apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Established TCP/MRCPv2 Connection %s",connection->id);
	connection->agent = agent;
	connection->it = apt_list_push_back(agent->connection_list,connection,connection->pool);
	connection->parser = mrcp_parser_create(agent->resource_factory,connection->pool);
	connection->generator = mrcp_generator_create(agent->resource_factory,connection->pool);
	return connection;
}
void LLSocket::setNonBlocking()
{
	// set up the socket options
	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));

}
예제 #13
0
파일: connection.c 프로젝트: liunx/myworks
/**
 * do_listen -- create a listen socket
 */
apr_status_t do_listen(apr_pollset_t *pollset, apr_hash_t *ht, 
		       apr_pool_t *mp, const char *param)
{
	apr_status_t rv;
	apr_socket_t *s;
	apr_sockaddr_t *sa;
	char **ptr;
	int port;
	
	ptr = str_split_char(param, ":");
	if (ptr == NULL) {
		fprintf(stderr, "Get Null param!\n");
		return APR_EINVAL;
	}
	// then convert param
	port = atoi(ptr[1]);
	if (port < 0)
		return APR_EINVAL;

	rv = apr_sockaddr_info_get(&sa, ptr[0], APR_INET, port, 0, mp);
	if (rv != APR_SUCCESS) {
		return rv;
	}
	
	rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp);
	if (rv != APR_SUCCESS) {
		return rv;
	}

	/* non-blocking socket */
	apr_socket_opt_set(s, APR_SO_NONBLOCK, 1);
	apr_socket_timeout_set(s, 0);
	apr_socket_opt_set(s, APR_SO_REUSEADDR, 1);/* this is useful for a 
						* server(socket listening) process */

	rv = apr_socket_bind(s, sa);
	if (rv != APR_SUCCESS) {
		return rv;
	}
	rv = apr_socket_listen(s, DEF_SOCKET_BACKLOG);
	if (rv != APR_SUCCESS) {
		return rv;
	}
	// Then.., add it to hash table, listen and connect socket 
	// against a different val, so we can distinguish in the 
	// pollset
	apr_hash_set(ht, s, APR_HASH_KEY_STRING, "S"); // server

	// Then.., if everything is OK, add it to the pollset
	apr_pollfd_t pfd = {mp, APR_POLL_SOCKET, APR_POLLIN, 0, {NULL}, NULL};
	pfd.desc.s = s;
	apr_pollset_add(pollset, &pfd);
	free(ptr);

	return APR_SUCCESS;
	
}
/**
 * Connect to the remote host
 */
static apr_status_t tcp_proxy_do_tcp_connect(request_rec * r,
                                             TcpProxyData * tpd,
                                             apr_pool_t * mp)
{
    apr_sockaddr_t *sa;
    apr_socket_t *s;
    apr_status_t rv;

    APACHELOG(APLOG_DEBUG, r,
              "tcp_proxy_do_tcp_connect: connect to host %s port %s",
              tpd->host, tpd->port);

    int port = atoi(tpd->port);
    rv = apr_sockaddr_info_get(&sa, tpd->host, APR_INET, port, 0, mp);
    if (rv != APR_SUCCESS) {
        return rv;
    }

    if (!port) {
        rv = apr_getservbyname(sa, tpd->port);
        if (rv != APR_SUCCESS) {
            return rv;
        }
    }

    rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp);
    if (rv != APR_SUCCESS) {
        return rv;
    }

    /* it is a good idea to specify socket options explicitly.
     * in this case, we make a blocking socket with timeout. */
    apr_socket_opt_set(s, APR_SO_NONBLOCK, 0);
    apr_socket_opt_set(s, APR_SO_KEEPALIVE, 1);
    if (tpd->timeout)
        apr_socket_timeout_set(s,
                               ((apr_interval_time_t) tpd->timeout) *
                               APR_USEC_PER_SEC);

    rv = apr_socket_connect(s, sa);
    if (rv != APR_SUCCESS) {
        return rv;
    }

    /* see the tutorial about the reason why we have to specify options again */
    apr_socket_opt_set(s, APR_SO_NONBLOCK, 0);
    apr_socket_opt_set(s, APR_SO_KEEPALIVE, 1);
    if (tpd->timeout)
        apr_socket_timeout_set(s,
                               ((apr_interval_time_t) tpd->timeout) *
                               APR_USEC_PER_SEC);

    tpd->tcpsocket = s;
    return APR_SUCCESS;
}
예제 #15
0
static void im_ssl_listen(nx_module_t *module)
{
    nx_im_ssl_conf_t *imconf;
    nx_exception_t e;

    imconf = (nx_im_ssl_conf_t *) module->config;

    try
    {
	if ( imconf->listensock == NULL )
	{
	    apr_sockaddr_t *sa;

	    CHECKERR_MSG(apr_socket_create(&(imconf->listensock), APR_INET, SOCK_STREAM,
					   APR_PROTO_TCP, module->input.pool),
			 "couldn't create tcp socket");

	    CHECKERR_MSG(apr_sockaddr_info_get(&sa, imconf->host, APR_INET, imconf->port, 
					       0, module->input.pool),
			 "apr_sockaddr_info failed for %s:%d", imconf->host, imconf->port);
	
	    CHECKERR_MSG(apr_socket_opt_set(imconf->listensock, APR_SO_NONBLOCK, 1),
			 "couldn't set SO_NONBLOCK on listen socket");
	    CHECKERR_MSG(apr_socket_timeout_set(imconf->listensock, 0),
			 "couldn't set socket timeout on listen socket");
	    CHECKERR_MSG(apr_socket_opt_set(imconf->listensock, APR_SO_REUSEADDR, 1),
			 "couldn't set SO_REUSEADDR on listen socket");
	    CHECKERR_MSG(apr_socket_opt_set(imconf->listensock, APR_TCP_NODELAY, 1),
			 "couldn't set TCP_NODELAY on listen socket");
	    CHECKERR_MSG(apr_socket_bind(imconf->listensock, sa),
			 "couldn't bind ssl socket to %s:%d", imconf->host, imconf->port);
	}
        else
	{
	    log_debug("ssl socket already initialized");
	}

	CHECKERR_MSG(apr_socket_listen(imconf->listensock, SOMAXCONN),
		     "couldn't listen to ssl socket on %s:%d",
		     imconf->host, imconf->port);
    
	nx_module_pollset_add_socket(module, imconf->listensock, APR_POLLIN | APR_POLLHUP);
    }
    catch(e)
    {
	if ( imconf->listensock != NULL )
	{
	    apr_socket_close(imconf->listensock);
	    imconf->listensock = NULL;
	}
	apr_pool_clear(module->input.pool);
	rethrow(e);
    }
}
예제 #16
0
파일: client.cpp 프로젝트: lamontnelson/rrr
void client_connect(client_t *cli) {
    LOG_DEBUG("connecting to server %s %d", cli->comm->ip, cli->comm->port);
    
    apr_status_t status = APR_SUCCESS;
    status = apr_sockaddr_info_get(&cli->comm->sa, cli->comm->ip, APR_INET, 
				   cli->comm->port, 0, cli->comm->mp);
    SAFE_ASSERT(status == APR_SUCCESS);

    status = apr_socket_create(&cli->comm->s, cli->comm->sa->family, 
			       SOCK_STREAM, APR_PROTO_TCP, cli->comm->mp);
    SAFE_ASSERT(status == APR_SUCCESS);

    status = apr_socket_opt_set(cli->comm->s, APR_TCP_NODELAY, 1);
    SAFE_ASSERT(status == APR_SUCCESS);

    while (1) {
	// repeatedly retry
        LOG_TRACE("TCP CLIENT TRYING TO CONNECT.");
        status = apr_socket_connect(cli->comm->s, cli->comm->sa);
        if (status == APR_SUCCESS /*|| status == APR_EINPROGRESS */) {
            break;
        } else if (status == APR_ECONNREFUSED) {
	    LOG_DEBUG("client connect refused, maybe the server is not ready yet");
	} else if (status == APR_EINVAL) {
	    LOG_ERROR("client connect error, invalid argument. ip: %s, port: %d", 
		      cli->comm->ip, cli->comm->port);
	    SAFE_ASSERT(0);
	} else {
            LOG_ERROR("client connect error:%s", apr_strerror(status, (char*)malloc(100), 100));
	    SAFE_ASSERT(0);
        }
	apr_sleep(50 * 1000);
    }
    LOG_INFO("connected socket on remote addr %s, port %d", cli->comm->ip, cli->comm->port);
    status = apr_socket_opt_set(cli->comm->s, APR_SO_NONBLOCK, 1);
    SAFE_ASSERT(status == APR_SUCCESS);
    
    // add to epoll
//    context_t *ctx = c->ctx;
//    while (ctx->ps == NULL) {
//        // not inited yet, just wait.
//    }
//
    apr_pollfd_t pfd = {cli->comm->mp, APR_POLL_SOCKET, APR_POLLIN, 0, {NULL}, NULL};
    pfd.desc.s = cli->comm->s;
    pfd.client_data = cli->pjob;
    cli->pjob->pfd = pfd;
    poll_mgr_add_job(cli->pjob->mgr, cli->pjob);
    
   // status = apr_pollset_add(pollset_, &ctx->pfd);
    //  status = apr_pollset_add(ctx->ps, &ctx->pfd);
    //    SAFE_ASSERT(status == APR_SUCCESS);
}
예제 #17
0
/** Create connection */
static apt_bool_t rtsp_client_connect(rtsp_client_t *client, rtsp_client_connection_t *connection, const char *ip, apr_port_t port)
{
	char *local_ip = NULL;
	char *remote_ip = NULL;
	apr_sockaddr_t *l_sockaddr = NULL;
	apr_sockaddr_t *r_sockaddr = NULL;

	if(apr_sockaddr_info_get(&r_sockaddr,ip,APR_INET,port,0,connection->pool) != APR_SUCCESS) {
		return FALSE;
	}

	if(apr_socket_create(&connection->sock,r_sockaddr->family,SOCK_STREAM,APR_PROTO_TCP,connection->pool) != APR_SUCCESS) {
		return FALSE;
	}

	apr_socket_opt_set(connection->sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(connection->sock, -1);
	apr_socket_opt_set(connection->sock, APR_SO_REUSEADDR, 1);

	if(apr_socket_connect(connection->sock,r_sockaddr) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		connection->sock = NULL;
		return FALSE;
	}

	if(apr_socket_addr_get(&l_sockaddr,APR_LOCAL,connection->sock) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		connection->sock = NULL;
		return FALSE;
	}

	apr_sockaddr_ip_get(&local_ip,l_sockaddr);
	apr_sockaddr_ip_get(&remote_ip,r_sockaddr);
	connection->id = apr_psprintf(connection->pool,"%s:%hu <-> %s:%hu",
		local_ip,l_sockaddr->port,
		remote_ip,r_sockaddr->port);

	memset(&connection->sock_pfd,0,sizeof(apr_pollfd_t));
	connection->sock_pfd.desc_type = APR_POLL_SOCKET;
	connection->sock_pfd.reqevents = APR_POLLIN;
	connection->sock_pfd.desc.s = connection->sock;
	connection->sock_pfd.client_data = connection;
	if(apt_poller_task_descriptor_add(client->task,&connection->sock_pfd) != TRUE) {
		apt_log(RTSP_LOG_MARK,APT_PRIO_WARNING,"Failed to Add to Pollset %s",connection->id);
		apr_socket_close(connection->sock);
		connection->sock = NULL;
		return FALSE;
	}

	apt_log(RTSP_LOG_MARK,APT_PRIO_NOTICE,"Established RTSP Connection %s",connection->id);
	return TRUE;
}
예제 #18
0
파일: server.c 프로젝트: EvaIPDBG/IPDBG
static int do_accept(serv_ctx_t *serv_ctx, apr_pollset_t *pollset, apr_socket_t *lsock, apr_pool_t *mp)
{
    apr_socket_t *ns;/* accepted socket */

    apr_status_t rv = apr_socket_accept(&ns, lsock, mp);
    if (rv == APR_SUCCESS)
    {
        //serv_ctx_t *serv_ctx = apr_palloc(mp, sizeof(serv_ctx_t));
        serv_ctx->up_buf_level = 0;
        serv_ctx->down_buf_level = 0;
        serv_ctx->channel_state = connected;


        apr_pollfd_t pfd = { mp, APR_POLL_SOCKET, APR_POLLIN|APR_POLLOUT|APR_POLLHUP, 0, { NULL }, serv_ctx };
        pfd.desc.s = ns;
        serv_ctx->mp = mp;

        /* non-blocking socket. We can't expect that @ns inherits non-blocking mode from @lsock */
        apr_socket_opt_set(ns, APR_SO_NONBLOCK, 1); //Setup socket options for the specified socket
        apr_socket_timeout_set(ns, 0);

        apr_pollset_add(pollset, &pfd); //Add a socket or file descriptor to a pollset

        //printf("connected client to channel %d\n", serv_ctx->channel_number);
    }
    return TRUE;
}
예제 #19
0
파일: connection.c 프로젝트: liunx/myworks
int do_accept(apr_pollset_t *pollset, apr_socket_t *lsock, apr_pool_t *mp)
{
	apr_socket_t *ns;/* accepted socket */
	apr_status_t rv;
			
	rv = apr_socket_accept(&ns, lsock, mp);
	if (rv == APR_SUCCESS) {
		serv_ctx_t *serv_ctx = apr_palloc(mp, sizeof(serv_ctx_t));
		apr_pollfd_t pfd = { mp, APR_POLL_SOCKET, APR_POLLIN, 0, { NULL }, serv_ctx };
		pfd.desc.s = ns;
		/* at first, we expect requests, so we poll APR_POLLIN event */
		serv_ctx->status = SERV_RECV_REQUEST;
		serv_ctx->cb_func = recv_req_cb;
		serv_ctx->recv.is_firstline = TRUE;
		serv_ctx->mp = mp;

	/**
	 * non-blocking socket. We can't expect that @ns 
	 * inherits non-blocking mode from @lsock 
	 */
		apr_socket_opt_set(ns, APR_SO_NONBLOCK, 1);
		apr_socket_timeout_set(ns, 0);
		
		apr_pollset_add(pollset, &pfd);
	}
	return TRUE;
}
예제 #20
0
static void* APR_THREAD_FUNC test_server_run(apr_thread_t *thd, void *data) {

	server_thread_data * server_data = (server_thread_data*)data;
	
	apr_status_t rv;
    apr_pool_t *mp;
    apr_socket_t *s;/* listening socket */

    apr_pool_create(&mp, NULL);

    rv = do_listen(&s, mp, server_data->port);
    if (rv != APR_SUCCESS) {
        char errbuf[256];
	    apr_strerror(rv, errbuf, sizeof(errbuf));
	    printf("test server error listening: %d, %s\n", rv, errbuf);
		apr_pool_destroy(mp);
		apr_thread_exit(thd, rv);
		return;
    }
	server_data->handle->test_server_running = 1;
    while (server_data->handle->test_server_running == 1) {
        apr_socket_t *ns;/* accepted socket */

		//printf("A");
        rv = apr_socket_accept(&ns, s, mp);
		if(rv == 11) {
			//printf(".");
		} else {
			//printf("B");
		    if (rv != APR_SUCCESS) {
		        char errbuf[256];
				apr_strerror(rv, errbuf, sizeof(errbuf));
				printf("test server error accepting: %d, %s\n", rv, errbuf);
				apr_pool_destroy(mp);
				apr_thread_exit(thd, rv);
				return;
		    }
		    /* it is a good idea to specify socket options for the newly accepted socket explicitly */
		    apr_socket_opt_set(ns, APR_SO_NONBLOCK, 0);
		    apr_socket_timeout_set(ns, 5000);

			rv = server_data->request_process_callback(ns, mp, server_data);
			apr_socket_close(ns);
		    if (rv != APR_SUCCESS) {
		        char errbuf[256];
				apr_strerror(rv, errbuf, sizeof(errbuf));
				printf("test server error processing: %d, %s\n", rv, errbuf);
				apr_pool_destroy(mp);
				apr_thread_exit(thd, rv);
				return;
		    }
		}
    }
	//printf("apr_pool_destroy\n");
    apr_pool_destroy(mp);
	//printf("apr_thread_exit\n");
    apr_thread_exit(thd, APR_SUCCESS);
	//printf("return\n");
	return NULL;
}
예제 #21
0
apr_status_t sspdy_connect(apr_socket_t **skt,
                           const char *hostname, apr_port_t port,
                           apr_pool_t *pool)
{
    apr_sockaddr_t *host_address = NULL;
    apr_status_t status;

    STATUSERR(apr_sockaddr_info_get(&host_address, hostname,
                                    APR_UNSPEC, port, 0, pool));

    STATUSERR(apr_socket_create(skt, host_address->family,
                                SOCK_STREAM, APR_PROTO_TCP, pool));

    STATUSERR(apr_socket_timeout_set(*skt, 0));

    STATUSERR(apr_socket_opt_set(*skt, APR_TCP_NODELAY, 1));

    status = apr_socket_connect(*skt, host_address);
    if (status != APR_SUCCESS) {
        if (!APR_STATUS_IS_EINPROGRESS(status))
            return status;
    }

    return APR_SUCCESS;
}
예제 #22
0
/** Create connection */
APT_DECLARE(apt_net_client_connection_t*) apt_net_client_connect(apt_net_client_task_t *task, const char *ip, apr_port_t port)
{
	apr_sockaddr_t *sockaddr;
	apt_net_client_connection_t *connection;
	apr_pool_t *pool;
	if(apr_pool_create(&pool,NULL) != APR_SUCCESS) {
		return NULL;
	}
	
	connection = apr_palloc(pool,sizeof(apt_net_client_connection_t));
	connection->pool = pool;
	connection->obj = NULL;
	connection->sock = NULL;

	if(apr_sockaddr_info_get(&sockaddr,ip,APR_INET,port,0,connection->pool) != APR_SUCCESS) {
		apr_pool_destroy(pool);
		return NULL;
	}

	if(apr_socket_create(&connection->sock,sockaddr->family,SOCK_STREAM,APR_PROTO_TCP,connection->pool) != APR_SUCCESS) {
		apr_pool_destroy(pool);
		return NULL;
	}

	apr_socket_opt_set(connection->sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(connection->sock, -1);
	apr_socket_opt_set(connection->sock, APR_SO_REUSEADDR, 1);

	if(apr_socket_connect(connection->sock,sockaddr) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		apr_pool_destroy(pool);
		return NULL;
	}

	connection->sock_pfd.desc_type = APR_POLL_SOCKET;
	connection->sock_pfd.reqevents = APR_POLLIN;
	connection->sock_pfd.desc.s = connection->sock;
	connection->sock_pfd.client_data = connection;
	if(apt_pollset_add(task->pollset,&connection->sock_pfd) != TRUE) {
		apr_socket_close(connection->sock);
		apr_pool_destroy(pool);
		return NULL;
	}
	
	apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Established TCP Connection %s:%d",ip,port);
	return connection;
}
예제 #23
0
파일: incoming.c 프로젝트: 2asoft/freebsd
apr_status_t serf_listener_create(
    serf_listener_t **listener,
    serf_context_t *ctx,
    const char *host,
    apr_uint16_t port,
    void *accept_baton,
    serf_accept_client_t accept,
    apr_pool_t *pool)
{
    apr_sockaddr_t *sa;
    apr_status_t rv;
    serf_listener_t *l = apr_palloc(pool, sizeof(*l));

    l->ctx = ctx;
    l->baton.type = SERF_IO_LISTENER;
    l->baton.u.listener = l;
    l->accept_func = accept;
    l->accept_baton = accept_baton;

    apr_pool_create(&l->pool, pool);

    rv = apr_sockaddr_info_get(&sa, host, APR_UNSPEC, port, 0, l->pool);
    if (rv)
        return rv;

    rv = apr_socket_create(&l->skt, sa->family,
                           SOCK_STREAM,
#if APR_MAJOR_VERSION > 0
                           APR_PROTO_TCP,
#endif
                           l->pool);
    if (rv)
        return rv;

    rv = apr_socket_opt_set(l->skt, APR_SO_REUSEADDR, 1);
    if (rv)
        return rv;

    rv = apr_socket_bind(l->skt, sa);
    if (rv)
        return rv;

    rv = apr_socket_listen(l->skt, 5);
    if (rv)
        return rv;

    l->desc.desc_type = APR_POLL_SOCKET;
    l->desc.desc.s = l->skt;
    l->desc.reqevents = APR_POLLIN;

    rv = ctx->pollset_add(ctx->pollset_baton,
                            &l->desc, &l->baton);
    if (rv)
        return rv;

    *listener = l;

    return APR_SUCCESS;
}
예제 #24
0
/** Create listening socket and add it to pollset */
static apt_bool_t mrcp_server_agent_listening_socket_create(mrcp_connection_agent_t *agent)
{
	apr_status_t status;
	if(!agent->sockaddr) {
		return FALSE;
	}

	/* create listening socket */
	status = apr_socket_create(&agent->listen_sock, agent->sockaddr->family, SOCK_STREAM, APR_PROTO_TCP, agent->pool);
	if(status != APR_SUCCESS) {
		return FALSE;
	}

	apr_socket_opt_set(agent->listen_sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(agent->listen_sock, -1);
	apr_socket_opt_set(agent->listen_sock, APR_SO_REUSEADDR, 1);

	status = apr_socket_bind(agent->listen_sock, agent->sockaddr);
	if(status != APR_SUCCESS) {
		apr_socket_close(agent->listen_sock);
		agent->listen_sock = NULL;
		return FALSE;
	}
	status = apr_socket_listen(agent->listen_sock, SOMAXCONN);
	if(status != APR_SUCCESS) {
		apr_socket_close(agent->listen_sock);
		agent->listen_sock = NULL;
		return FALSE;
	}

	/* add listening socket to pollset */
	memset(&agent->listen_sock_pfd,0,sizeof(apr_pollfd_t));
	agent->listen_sock_pfd.desc_type = APR_POLL_SOCKET;
	agent->listen_sock_pfd.reqevents = APR_POLLIN;
	agent->listen_sock_pfd.desc.s = agent->listen_sock;
	agent->listen_sock_pfd.client_data = agent->listen_sock;
	if(apt_poller_task_descriptor_add(agent->task, &agent->listen_sock_pfd) != TRUE) {
		apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Add Listening Socket to Pollset [%s]",
			apt_task_name_get(apt_poller_task_base_get(agent->task)));
		apr_socket_close(agent->listen_sock);
		agent->listen_sock = NULL;
		return FALSE;
	}

	return TRUE;
}
예제 #25
0
/** Create listening socket and add it to pollset */
static apt_bool_t rtsp_server_listening_socket_create(rtsp_server_t *server)
{
	apr_status_t status;
	
	if(!server->sockaddr) {
		return FALSE;
	}

	/* create listening socket */
	status = apr_socket_create(&server->listen_sock, server->sockaddr->family, SOCK_STREAM, APR_PROTO_TCP, server->pool);
	if(status != APR_SUCCESS) {
		return FALSE;
	}

	apr_socket_opt_set(server->listen_sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(server->listen_sock, -1);
	apr_socket_opt_set(server->listen_sock, APR_SO_REUSEADDR, 1);

	status = apr_socket_bind(server->listen_sock, server->sockaddr);
	if(status != APR_SUCCESS) {
		apr_socket_close(server->listen_sock);
		server->listen_sock = NULL;
		return FALSE;
	}
	status = apr_socket_listen(server->listen_sock, SOMAXCONN);
	if(status != APR_SUCCESS) {
		apr_socket_close(server->listen_sock);
		server->listen_sock = NULL;
		return FALSE;
	}

	/* add listening socket to pollset */
	memset(&server->listen_sock_pfd,0,sizeof(apr_pollfd_t));
	server->listen_sock_pfd.desc_type = APR_POLL_SOCKET;
	server->listen_sock_pfd.reqevents = APR_POLLIN;
	server->listen_sock_pfd.desc.s = server->listen_sock;
	server->listen_sock_pfd.client_data = server->listen_sock;
	if(apt_poller_task_descriptor_add(server->task, &server->listen_sock_pfd) != TRUE) {
		apt_log(RTSP_LOG_MARK,APT_PRIO_WARNING,"Failed to Add Listening Socket to Pollset");
		apr_socket_close(server->listen_sock);
		server->listen_sock = NULL;
		return FALSE;
	}

	return TRUE;
}
예제 #26
0
int sock_connect(net_sock_t *nsock, const char *hostname, int port, Net_timeout_t timeout)
{
    int err;
    Net_timeout_t tm;

    network_sock_t *sock = (network_sock_t *)nsock;

    if (sock == NULL) return(-1);   //** If NULL exit

    if (sock->fd != NULL) apr_socket_close(sock->fd);

    sock->fd = NULL;
    sock->sa = NULL;

    log_printf(0, " sock_connect: hostname=%s:%d to=" TT "\n", hostname, port, timeout);
//   err = apr_sockaddr_info_get(&(sock->sa), hostname, APR_INET, port, APR_IPV4_ADDR_OK, sock->mpool);
    err = apr_sockaddr_info_get(&(sock->sa), hostname, APR_INET, port, 0, sock->mpool);
//log_printf(0, "sock_connect: apr_sockaddr_info_get: err=%d\n", err);
//if (sock->sa == NULL) log_printf(0, "sock_connect: apr_sockaddr_info_get: sock->sa == NULL\n");

    if (err != APR_SUCCESS) return(err);

    err = apr_socket_create(&(sock->fd), APR_INET, SOCK_STREAM, APR_PROTO_TCP, sock->mpool);
//log_printf(0, "sock_connect: apr_sockcreate: err=%d\n", err);
    if (err != APR_SUCCESS) return(err);


////   apr_socket_opt_set(sock->fd, APR_SO_NONBLCK, 1);
    apr_socket_timeout_set(sock->fd, timeout);
    if (sock->tcpsize > 0) {
        apr_socket_opt_set(sock->fd, APR_SO_SNDBUF, sock->tcpsize);
        apr_socket_opt_set(sock->fd, APR_SO_RCVBUF, sock->tcpsize);
    }

    err = apr_socket_connect(sock->fd, sock->sa);
//log_printf(0, "sock_connect: apr_socket_connect: err=%d\n", err); flush_log();

    //** Set a default timeout
    set_net_timeout(&tm, 0, SOCK_DEFAULT_TIMEOUT);
    apr_socket_timeout_set(sock->fd, tm);

    return(err);
}
예제 #27
0
static mrcp_connection_t* mrcp_client_agent_connection_create(mrcp_connection_agent_t *agent, mrcp_control_descriptor_t *descriptor)
{
	mrcp_connection_t *connection = mrcp_connection_create();

	connection->remote_ip = descriptor->ip;
	apr_sockaddr_info_get(&connection->sockaddr,descriptor->ip.buf,APR_INET,descriptor->port,0,connection->pool);
	if(!connection->sockaddr) {
		mrcp_connection_destroy(connection);
		return NULL;
	}

	if(apr_socket_create(&connection->sock, connection->sockaddr->family, SOCK_STREAM, APR_PROTO_TCP, connection->pool) != APR_SUCCESS) {
		mrcp_connection_destroy(connection);
		return NULL;
	}

	apr_socket_opt_set(connection->sock, APR_SO_NONBLOCK, 0);
	apr_socket_timeout_set(connection->sock, -1);
	apr_socket_opt_set(connection->sock, APR_SO_REUSEADDR, 1);

	if(apr_socket_connect(connection->sock, connection->sockaddr) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		mrcp_connection_destroy(connection);
		return NULL;
	}

	connection->sock_pfd.desc_type = APR_POLL_SOCKET;
	connection->sock_pfd.reqevents = APR_POLLIN;
	connection->sock_pfd.desc.s = connection->sock;
	connection->sock_pfd.client_data = connection;
	if(apr_pollset_add(agent->pollset, &connection->sock_pfd) != APR_SUCCESS) {
		apr_socket_close(connection->sock);
		mrcp_connection_destroy(connection);
		return NULL;
	}
	
	apt_log(APT_PRIO_NOTICE,"Established TCP/MRCPv2 Connection %s:%d",
			connection->remote_ip.buf,
			connection->sockaddr->port);
	connection->it = apt_list_push_back(agent->connection_list,connection);
	return connection;
}
예제 #28
0
LLIODataSocket::LLIODataSocket(
	U16 suggested_port,
	U16 start_discovery_port,
	apr_pool_t* pool) : 
	mSocket(NULL)
{
	if(!pool || (PORT_INVALID == suggested_port)) return;
	if(ll_apr_warn_status(apr_socket_create(&mSocket, APR_INET, SOCK_DGRAM, APR_PROTO_UDP, pool))) return;
	apr_sockaddr_t* sa = NULL;
	if(ll_apr_warn_status(apr_sockaddr_info_get(&sa, APR_ANYADDR, APR_UNSPEC, suggested_port, 0, pool))) return;
	apr_status_t status = apr_socket_bind(mSocket, sa);
	if((start_discovery_port > 0) && is_addr_in_use(status))
	{
		const U16 MAX_ATTEMPT_PORTS = 50;
		for(U16 attempt_port = start_discovery_port;
			attempt_port < (start_discovery_port + MAX_ATTEMPT_PORTS);
			++attempt_port)
		{
			sa->port = attempt_port;
			sa->sa.sin.sin_port = htons(attempt_port);
			status = apr_socket_bind(mSocket, sa);
			if(APR_SUCCESS == status) break;
			if(is_addr_in_use(status)) continue;
			(void)ll_apr_warn_status(status);
		}
	}
	if(ll_apr_warn_status(status)) return;
	if(sa->port)
	{
		lldebugs << "Bound datagram socket to port: " << sa->port << llendl;
		mPort = sa->port;
	}
	else
	{
		mPort = LLIOSocket::PORT_EPHEMERAL;
	}

	// set up the socket options options
	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
}
예제 #29
0
파일: server.c 프로젝트: Abioy/mpaxos
void handle_server_accept(void* arg) {
    server_t *svr = (server_t *) arg;

    apr_status_t status = APR_SUCCESS;
    apr_socket_t *ns = NULL;
    
    LOG_TRACE("on new connection");

    status = apr_socket_accept(&ns, svr->comm->s, svr->comm->mp);

//    apr_socket_t *sock_listen = r->com.s;
//    LOG_INFO("accept on fd %x", sock_listen->socketdes);
    LOG_INFO("accept new connection");

    if (status == APR_EMFILE) {
	LOG_ERROR("cannot open more file handles, please check system configurations.");
	SAFE_ASSERT(0);
    } else if (status == APR_ENFILE) {
	LOG_ERROR("cannot open more file handles, please check system configurations.");
	SAFE_ASSERT(0);
    }

    if (status != APR_SUCCESS) {
        LOG_ERROR("recvr accept error.");
        LOG_ERROR("%s", apr_strerror(status, calloc(100, 1), 100));
        SAFE_ASSERT(status == APR_SUCCESS);
    }

    apr_socket_opt_set(ns, APR_SO_NONBLOCK, 1);
    apr_socket_opt_set(ns, APR_TCP_NODELAY, 1);
//    apr_socket_opt_set(ns, APR_SO_REUSEADDR, 1);

    sconn_t *sconn;
    sconn_create(&sconn, svr);

    apr_pollfd_t pfd = {svr->comm->mp, APR_POLL_SOCKET, APR_POLLIN, 0, {NULL}, NULL};
    pfd.desc.s = ns;
    pfd.client_data = sconn->pjob;
    sconn->pjob->pfd = pfd;
    sconn->pjob->mgr = svr->pjob->mgr;
    poll_mgr_add_job(sconn->pjob->mgr, sconn->pjob);
}
예제 #30
0
void LLPluginMessagePipe::setSocketTimeout(apr_interval_time_t timeout_usec)
{
	// We never want to sleep forever, so force negative timeouts to become non-blocking.

	// according to this page: http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html
	// blocking/non-blocking with apr sockets is somewhat non-portable.
	
	if(timeout_usec <= 0)
	{
		// Make the socket non-blocking
		apr_socket_opt_set(mSocket->getSocket(), APR_SO_NONBLOCK, 1);
		apr_socket_timeout_set(mSocket->getSocket(), 0);
	}
	else
	{
		// Make the socket blocking-with-timeout
		apr_socket_opt_set(mSocket->getSocket(), APR_SO_NONBLOCK, 1);
		apr_socket_timeout_set(mSocket->getSocket(), timeout_usec);
	}
}