2008年12月15日星期一

APR server侦听

static apr_status_t do_listen(apr_socket_t **sock, apr_pool_t *mp)
{
apr_status_t rv;
apr_socket_t *s;
apr_sockaddr_t *sa;

rv = apr_sockaddr_info_get(&sa, NULL, APR_INET6, DEF_LISTEN_PORT, 0, mp);
//取得Socket地址
if (rv != APR_SUCCESS) {
return rv;
}

rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp);
//建立Socket对象
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, -1);
apr_socket_opt_set(s, APR_SO_REUSEADDR, 1);/* this is useful for a server(socket listening) process */
//将Socekt地址绑定到Socket对象
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;
}

没有评论: