Example #1
0
int main(void)
{
    
    struct addrinfo hints, *res;
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    int rv;
    if ((rv = getaddrinfo(NULL, "12344", &hints, &res))) {
        fprintf(stderr, "gai:%s\n", gai_strerror(rv));
    }

    for (struct addrinfo *p = res; p != NULL; p = p->ai_next) {
        listen_sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
        if (listen_sock == -1)  {
            perror("skt");
            continue;
        }

        int yes = 1;
        if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, 
                    &yes, sizeof(yes)) == -1) {
            perror("sso");
            exit(1);
        }
        
        if (bind(listen_sock, p->ai_addr, p->ai_addrlen) == -1 ) {
            close(listen_sock);
            perror("bind");
            continue;
        }
    }
    freeaddrinfo(res);

    if (listen(listen_sock, SOMAXCONN) == -1) {
        perror("listen");
        exit(1);
    }

    ex_nonblocking(listen_sock);

    base = lt_base_init();
    
    eventarray[listen_sock] = lt_io_add(base, listen_sock, LV_FDRD, incoming, 
            &listen_sock, NO_TIMEOUT);

    lt_base_loop(base, NO_TIMEOUT);

    return 0;
}
Example #2
0
int proxy_connect(http_t *http, connection_t *conn)
{
    conn->peer_addr_in.sin_family = AF_INET;
    conn->peer_addr_in.sin_port = htons(80);
    inet_pton(conn->peer_addr_in.sin_family, 
              conn->peer_addr_c, 
             &conn->peer_addr_in.sin_addr);
//proxy connection initiazation
    conn->pair = lt_alloc(&http->listen.connection_pool_manager);
    conn->pair->request_pool_manager = conn->request_pool_manager;
    conn->pair->buf_pool = conn->buf_pool;
    conn->pair->buf_pool_manager = conn->buf_pool_manager;
    conn->pair->request_pool_manager = conn->request_pool_manager;
        
    conn->pair->pair = conn;

    conn->pair->fd = socket(conn->peer_addr_in.sin_family, 
                      SOCK_STREAM|SOCK_NONBLOCK,
                      IPPROTO_TCP);
    if (conn->pair->fd == -1) {
        perror("socket proxy backend");
        return LERROR;
    }
    conn->pair->status = L_PROXY_CONNECTING;
    
    int rv = connect(conn->pair->fd, 
                     (struct sockaddr *)&conn->peer_addr_in, 
                     sizeof(struct sockaddr));
    if (rv < 0 && errno == EINPROGRESS) {
        conn->pair->ev = lt_io_add(conn->ev->base, conn->pair->fd, 
                LV_FDWR|LV_CONN|LV_ONESHOT, proxy_connect_writable, conn->pair, NO_TIMEOUT);
        return LAGAIN;
    } else if (!rv) {
        conn->pair->status = L_PROXY_CONNECTED;
        return LOK;
        //SUCCESS
    } else {
        return LERROR;
        perror("connect:");
    }

    return LERROR;
}
Example #3
0
int incoming(int test, void *arg)
{
    struct sockaddr_storage sa;
    socklen_t addr_len = sizeof(sa);
    int my_sock = *(int *)arg;

    int *new_in_fd = malloc(sizeof(int));
    *new_in_fd = accept(my_sock, (struct sockaddr *)&sa, &addr_len);
    if (*new_in_fd == -1) {
        perror("acpt");
        return -1;;
    }

    ex_nonblocking(*new_in_fd);
    eventarray[*new_in_fd] = 
        lt_io_add(base, *new_in_fd, LV_LAG|LV_FDRD|LV_CONN, play_back, new_in_fd, NO_TIMEOUT);
    n++;

    return 0;
}