void bd_lt_listener(lthread_t *lt, int args) { lthread_t *lt_new; socklen_t addrlen; int s_fd, c_fd; struct sockaddr_in cin; DEFINE_LTHREAD(lt); s_fd = e_listener("0.0.0.0", 5557); if (!s_fd) { perror("Cannot listen on socket"); return; } while (1) { c_fd = lthread_accept(lt, s_fd, (struct sockaddr *)&cin, &addrlen); if (!c_fd) { continue; } lthread_create(lthread_get_sched(lt), <_new, bd_lt_cli, (void *)c_fd); } }
TcpServer::ConnectionInfo TcpServer::takeNext() { sockaddr_in peer_addr; socklen_t addrlen = sizeof(peer_addr); // block until a new connection arrives //printf("accept: %d, %d\n", fd, addrlen); int clientFd = lthread_accept(fd, (sockaddr *)&peer_addr, &addrlen); if(clientFd == -1) { perror("Failed to accept connection"); abort(); return ConnectionInfo(); } ConnectionInfo ci; ci.sock = clientFd; ci.peerAddress = QHostAddress((sockaddr *)&peer_addr); return ci; }
void lt_main(void *arg) { int fd, opt = 1; proxy_server *srv = (proxy_server*)arg; lthread_t *lt_accept = NULL; struct sockaddr cin = {0}; socklen_t addrlen = sizeof(struct sockaddr); proxy_conn_t *proxy = NULL; DEFINE_LTHREAD; lthread_detach(); srv->listen_fd = create_listener("0.0.0.0", 9000); if(srv->listen_fd < 0) { exit(1); } fprintf(stderr, "listener creating :9000\n"); lthread_create(<_accept, (void*)lt_accept_loop, (void*)srv); while(!srv->is_die) { fd = lthread_accept(srv->listen_fd, &cin, &addrlen); if(fd < 0) { perror("accept error"); break; } if(srv->quiting) { lthread_close(fd); break; } if(srv->is_die) { //already die, close and break lthread_close(fd); fprintf(stderr, "server already die :9000\n"); break; } if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) == -1) { perror("failed to set SOREUSEADDR on socket"); break; } fprintf(stderr, "accept new client\n"); proxy = proxy_conn_create(fd, 0); if(0 != chan_send(srv->accepts_ch, proxy)) { //send failed, free proxy proxy_conn_free(proxy); break; } //yield myself lthread_sleep((uint64_t)0); } if(-1 != srv->listen_fd) { close(srv->listen_fd); srv->listen_fd = -1; } if(!srv->is_die) { srv->is_die = 1; chan_close(srv->die_ch); fprintf(stderr, "srv die\n"); } fprintf(stderr, "lt_accept end\n"); lthread_join(lt_accept, NULL, LTHREAD_FOREVER); //server release server_release(srv); }