예제 #1
0
void cServerHandleImpl::Close(void)
{
	// Stop the listener sockets:
	evconnlistener_disable(m_ConnListener);
	if (m_SecondaryConnListener != nullptr)
	{
		evconnlistener_disable(m_SecondaryConnListener);
	}
	m_IsListening = false;

	// Shutdown all connections:
	cTCPLinkImplPtrs Conns;
	{
		cCSLock Lock(m_CS);
		std::swap(Conns, m_Connections);
	}
	for (auto conn: Conns)
	{
		conn->Shutdown();
	}

	// Remove the ptr to self, so that the object may be freed:
	m_SelfPtr.reset();

	// Remove self from cNetworkSingleton:
	cNetworkSingleton::Get().RemoveServer(this);
}
예제 #2
0
static void
errorcb(struct evconnlistener *lis, void *data_)
{
	int *data = data_;
	*data = 1000;
	evconnlistener_disable(lis);
}
예제 #3
0
파일: imap.c 프로젝트: lntoly/skeeter
static void
trigger_listener(int flags, void *ctx)
{
    struct evconnlistener *listener = ctx;
    if (flags & MODULE_READY)
        evconnlistener_enable(listener);
    else
        evconnlistener_disable(listener);
}
예제 #4
0
static void
acceptcb(struct evconnlistener *listener, evutil_socket_t fd,
    struct sockaddr *addr, int socklen, void *arg)
{
	int *ptr = arg;
	--*ptr;
	TT_BLATHER(("Got one for %p", ptr));
	EVUTIL_CLOSESOCKET(fd);

	if (! *ptr)
		evconnlistener_disable(listener);
}
예제 #5
0
static void on_output_timer (evutil_socket_t fd, short event, void *ctx)
{
    OutData *out = (OutData *) ctx;
    struct timeval tv;
    struct evbuffer *out_buf;
    char *buf;
    char c;

    LOG_debug (HTTP_TEST, "SRV: on output timer ..");

    if (out->test_id < TID_body && out->timer_count >= evbuffer_get_length (out->out_buf)) {
        bufferevent_free (out->bev);
        evconnlistener_disable (out->listener);
        event_base_loopbreak (out->evbase);
        LOG_debug (HTTP_TEST, "SRV: All headers data sent !! ");
        return;
    }
    
    out_buf = evbuffer_new ();

    if (out->test_id < TID_body) {
        buf = (char *)evbuffer_pullup (out->out_buf, -1);
        c = buf[out->timer_count];

        evbuffer_add (out_buf, &c, sizeof (c));
        out->timer_count++;
        LOG_debug (HTTP_TEST, "SRV: Sending %zd bytes:\n>>%s<<\n", evbuffer_get_length (out_buf), evbuffer_pullup (out_buf, -1));
    } else {
        if (!out->header_sent) {
            evbuffer_add_buffer (out_buf, out->out_buf);
            out->header_sent = TRUE;
        }
        /*
        if (evbuffer_get_length (out->in_file) < 1) {
            bufferevent_free (out->bev);
            evconnlistener_disable (out->listener);
            event_base_loopbreak (out->evbase);
            LOG_debug (HTTP_TEST, "SRV: All data sent !! ");
            return;
        }*/
        evbuffer_remove_buffer (out->in_file, out_buf, 1024*100);

        LOG_debug (HTTP_TEST, "SRV: Sending BODY %zd bytes", evbuffer_get_length (out_buf));
    }

    bufferevent_write_buffer (out->bev, out_buf);
    evbuffer_free (out_buf);
    
    evutil_timerclear(&tv);
    tv.tv_sec = 0;
    tv.tv_usec = 500;
    event_add(out->timeout, &tv);
}
예제 #6
0
void NetServer::StopListen() {
	evconnlistener_disable(listener);
	StopBroadcast();
}
예제 #7
0
파일: server.c 프로젝트: LaKabane/tNETacle
int
server_init(struct server *s, struct event_base *evbase)
{
    struct cfg_sockaddress *it_listen = NULL;
    struct cfg_sockaddress *ite_listen = NULL;
    struct cfg_sockaddress *it_client = NULL;
    struct cfg_sockaddress *ite_client = NULL;
    struct cfg_sockaddress *it_peer = NULL;
    struct cfg_sockaddress *ite_peer = NULL;
    size_t i = 0;

    s->peers = v_mc_new();
    s->pending_peers = v_mc_new();
    s->srv_list = v_evl_new();
    s->frames_to_send = v_frame_new();
    s->evbase = evbase;

    it_listen = v_sockaddr_begin(serv_opts.listen_addrs);
    ite_listen = v_sockaddr_end(serv_opts.listen_addrs);
    s->ev_sched = sched_new(evbase);

    /* Listen on all ListenAddress */
    for (; it_listen != ite_listen; it_listen = v_sockaddr_next(it_listen), ++i)
    {
        struct evconnlistener *evl = NULL;
        char listenname[INET6_ADDRSTRLEN];
        struct endpoint endp;

        evl = evconnlistener_new_bind(evbase, listen_callback,
            s, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
            (struct sockaddr *)&it_listen->sockaddr, it_listen->len);
        if (evl == NULL) {
            log_warnx("[INIT] failed to allocate the listener to listen to %s",
                address_presentation((struct sockaddr *)&it_listen->sockaddr,
                it_listen->len, listenname, sizeof listenname));
             continue;
        }
        evconnlistener_set_error_cb(evl, NULL);
        evconnlistener_disable(evl);

        /* udp endpoint init */

        /*
         * We listen on the same address for the udp socket
         */
        endpoint_init(&endp, (struct sockaddr *)&it_listen->sockaddr,
                      it_listen->len);
        s->udp = server_udp_new(s, &endp);
        if (s->udp == NULL)
        {
            log_warnx("[INIT] [UDP] failed to init the udp socket on %s",
                  address_presentation((struct sockaddr *)&it_listen->sockaddr,
                                           it_listen->len, listenname,
                                           sizeof listenname));
            continue;
        }

        v_evl_push(s->srv_list, evl);
    }

	// Listen enable for client in the ports registered
    it_client = v_sockaddr_begin(serv_opts.client_addrs);
    ite_client = v_sockaddr_end(serv_opts.client_addrs);

#ifdef USE_TCLT
    /* Listen on all ClientAddress */
    for (; it_client != ite_client; it_client = v_sockaddr_next(it_client), ++i)
    {
        char clientname[INET6_ADDRSTRLEN];
        struct evconnlistener *evl = NULL;
		evl = evconnlistener_new_bind(evbase, listen_client_callback,
			  s, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
		  (struct sockaddr *)&it_client->sockaddr, it_client->len);
		if (evl == NULL) {
			log_warnx("[INIT] [TCP] failed to allocate the listener to listen to %s",
			  address_presentation((struct sockaddr *)
				&it_client->sockaddr, it_client->len, clientname,
				sizeof clientname));
			continue;
		}
		evconnlistener_set_error_cb(evl, NULL);
		evconnlistener_enable(evl);
		v_evl_push(s->srv_list, evl);
	}
#endif

    /* If we don't have any PeerAddress it's finished */
    if (v_sockaddr_size(serv_opts.peer_addrs) == 0)
        return 0;

    it_peer = v_sockaddr_begin(serv_opts.peer_addrs);
    ite_peer = v_sockaddr_end(serv_opts.peer_addrs);
    for (;it_peer != ite_peer; it_peer = v_sockaddr_next(it_peer))
    {
        struct mc *mc_peer = NULL;
#ifdef USE_TCLT
        peer p;
        char *cmd;

        /* TODO : Real information */
        p.name = strdup("");
        p.name = strdup("");
        p.name = strdup("");
#endif
        mc_peer = mc_peer_connect(s, evbase,
                        (struct sockaddr *)&it_peer->sockaddr,
                        it_peer->len);
#ifdef USE_TCLT
        if (mc_peer != NULL && s->mc_client.bev)
        {
            cmd = tclt_add_peer(&p);
            bufferevent_write(s->mc_client.bev, cmd, strlen(cmd));
            free(cmd);
        }
#endif
    }
    return 0;
}