Exemplo n.º 1
0
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), &lt_new, bd_lt_cli,
		    (void *)c_fd);
	}
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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(&lt_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);
}