int pair_pingpong (int use_pipe) { a_got_close = 0; a_got_connect = 0; b_got_close = 0; b_got_connect = 0; pair_pingpong_cnt = 0; evcom_stream_init(&a); a.on_close = a_close; a.on_connect = a_connect; a.on_read = a_read; evcom_stream_reset_timeout(&a, PAIR_PINGPONG_TIMEOUT); #if EVCOM_HAVE_GNUTLS if (use_tls) anon_tls_client(&a); #endif evcom_stream_init(&b); b.on_close = b_close; b.on_connect = b_connect; b.on_read = b_read; evcom_stream_reset_timeout(&b, PAIR_PINGPONG_TIMEOUT); #if EVCOM_HAVE_GNUTLS if (use_tls) anon_tls_server(&b); #endif if (use_pipe) { int pipeA[2], pipeB[2]; assert(0 == pipe(pipeA)); assert(0 == pipe(pipeB)); evcom_stream_assign_fds(&a, pipeA[0], pipeB[1]); evcom_stream_assign_fds(&b, pipeB[0], pipeA[1]); } else { int r = evcom_stream_pair(&a, &b); assert(r == 0); } evcom_stream_attach(EV_DEFAULT_ &a); evcom_stream_attach(EV_DEFAULT_ &b); evcom_stream_write(&a, PING, strlen(PING)); ev_loop(EV_DEFAULT_ 0); assert(a_got_close); assert(a_got_connect); assert(b_got_close); assert(b_got_connect); assert(pair_pingpong_cnt == PAIR_PINGPONG_EXCHANGES); return 0; }
void evcom_stream_close (evcom_stream *stream) { stream->flags |= EVCOM_GOT_CLOSE; if (ATTACHED(stream)) { // start the watchers if attached. evcom_stream_attach(D_LOOP_(stream) stream); } }
/* Internal callback * Called by server->watcher. */ static int accept_connections (evcom_descriptor *d) { evcom_server *server = (evcom_server *)d; assert(LISTENING(server)); /* accept as many connections as possible */ evcom_stream *stream; while (server->fd >= 0 && (stream = accept_connection(server))) { evcom_stream_attach(D_LOOP_(server) stream); } return AGAIN; }
int pingpong (struct sockaddr *address) { int r; evcom_stream client; successful_ping_count = 0; nconnections = 0; got_server_close = 0; evcom_server_init(&server); server.on_connection = pingpong_on_server_connection; server.on_close = common_on_server_close; r = evcom_server_listen(&server, address, 10); assert(r == 0); evcom_server_attach(EV_DEFAULT_ &server); evcom_stream_init(&client); client.on_read = pingpong_on_client_read; client.on_connect = pingpong_on_client_connect; client.on_close = pingpong_on_client_close; client.on_timeout = common_on_client_timeout; evcom_stream_reset_timeout(&client, PINGPONG_TIMEOUT); assert(EVCOM_INITIALIZED == evcom_stream_state(&client)); #if EVCOM_HAVE_GNUTLS if (use_tls) anon_tls_client(&client); #endif r = evcom_stream_connect(&client, address); assert(r == 0 && "problem connecting"); evcom_stream_attach(EV_DEFAULT_ &client); ev_loop(EV_DEFAULT_ 0); printf("successful_ping_count = %d\n", successful_ping_count); assert(successful_ping_count == EXCHANGES + 1); assert(nconnections == 1); assert(got_server_close); return 0; }
int zero_stream (struct sockaddr *address, size_t to_write) { int r; assert(to_write >= 1024); // should be kind of big at least. zero_to_write = to_write; got_server_close = 0; zero_written = 0; zero_read = 0; zero_client_closed = 0; evcom_server_init(&server); server.on_connection = make_echo_connection; server.on_close = common_on_server_close; evcom_server_listen(&server, address, 1000); evcom_server_attach(EV_DEFAULT_ &server); evcom_stream client; evcom_stream_init(&client); client.on_read = zero_recv; client.on_connect = zero_start; client.on_close = zero_close; client.on_timeout = error_out; evcom_stream_reset_timeout(&client, ZERO_TIMEOUT); #if EVCOM_HAVE_GNUTLS if (use_tls) anon_tls_client(&client); #endif r = evcom_stream_connect(&client, address); assert(r == 0 && "problem connecting"); evcom_stream_attach(EV_DEFAULT_ &client); ev_loop(EV_DEFAULT_ 0); assert(got_server_close); assert(zero_written == zero_to_write); assert(zero_read == zero_to_write); assert(zero_client_closed) ; return 0; }
int connint (struct sockaddr *address) { int r; nconnections = 0; got_server_close = 0; evcom_server_init(&server); server.on_connection = connint_on_connection; server.on_close = common_on_server_close; evcom_server_listen(&server, address, 1000); evcom_server_attach(EV_DEFAULT_ &server); evcom_stream clients[NCONN]; int i; for (i = 0; i < NCONN; i++) { evcom_stream *client = &clients[i]; evcom_stream_init(client); client->on_read = connint_on_client_read; client->on_connect = connint_on_client_connect; client->on_close = connint_on_client_close; client->on_timeout = common_on_client_timeout; evcom_stream_reset_timeout(client, CONNINT_TIMEOUT); #if EVCOM_HAVE_GNUTLS if (use_tls) anon_tls_client(client); #endif r = evcom_stream_connect(client, address); assert(r == 0 && "problem connecting"); evcom_stream_attach(EV_DEFAULT_ client); } ev_loop(EV_DEFAULT_ 0); assert(nconnections == NCONN); assert(got_server_close); return 0; }