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; }
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; }
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; }