示例#1
0
bool test_server_create_invalid_argument_4 (Test *test)
{
        TITLE ();
        CATCH (net_server_create ("127.0.0.1", 8888, &on_connect, NULL, NULL));
        CATCH (error_count () != 1);
        CATCH (error_at (0).error != ErrorInvalidArgument);
        CATCH (error_at (0).code != 4);
        PASS ();
}
示例#2
0
bool test_server_create_invalid_argument_1 (Test *test)
{
        TITLE ();
        CATCH (net_server_create (NULL, 0, NULL, NULL, NULL));
        CATCH (error_count () != 1);
        CATCH (error_at (0).error != ErrorInvalidArgument);
        CATCH (error_at (0).code != 1);
        PASS ();
}
示例#3
0
bool test_server_create (Test *test)
{
        NetServer *server;

        TITLE ();
        CATCH (!(server = net_server_create ("127.0.0.1", 8888, &on_connect, &on_error, NULL)));
        CATCH (error_count () != 0);
        net_server_destroy (server);
        PASS ();
}
示例#4
0
bool test_server_create_function_call_1 (Test *test)
{
        TITLE ();
        memory_commit_limit (sizeof (size_t) + sizeof (NetServer) - 1);
        CATCH (net_server_create ("127.0.0.1", 8888, &on_connect, &on_error, NULL));
        CATCH (error_count () == 0);
        CATCH (error_at (0).error != ErrorFunctionCall);
        CATCH (error_at (0).code != 1);
        PASS ();
}
示例#5
0
文件: net.c 项目: Jahaja/cityslicker
net_server *net_server_start(int port) {
    int optval = 1, res;
    net_file_event *fe = NULL;

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(struct sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(port);

    signal(SIGPIPE, SIG_IGN);

    net_server *s = net_server_create();
    if(!s) goto err;

    s->fd = socket(AF_INET, SOCK_STREAM, 0);
    if(s->fd == -1) goto err;

    setsockopt(s->fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
    res = bind(s->fd, (const struct sockaddr *) &addr, sizeof(struct sockaddr_in));
    if(res != 0) goto err;

    res = listen(s->fd, NET_SERVER_BACKLOG);
    if(res != 0) goto err;

    // create epoll instance and add the server fd
    int epfd = epoll_create(NET_EPOLL_HINT);
    if(epfd == -1) goto err;

    s->epfd = epfd;

    fe = net_file_event_create((void *) s, net_file_event_type_server);
    if(!fe) goto err;

    struct epoll_event ee;
    memset(&ee, 0, sizeof(struct epoll_event));
    ee.events |= EPOLLIN;
    ee.data.u64 = 0;
    ee.data.ptr = (void *) fe;

    res = epoll_ctl(epfd, EPOLL_CTL_ADD, s->fd, &ee);
    if(res == -1) goto err;

    return s;

err:
    log_error("Failed to start server: %s\n", strerror(errno));
    if(s) net_server_destroy(s);
    if(fe) net_file_event_destroy(fe);
    return NULL;
}
bool test_poll_close_2 (Test *test)
{
        NetPoll *poll;
        NetServer *server;
        NetClientConnection connection;
        NetClient *client;

        TITLE ();
        monitor_success = false;
        close_success = false;
        poll_connection.closed = false;
        poll_connection.socket = 0;
        poll_connection.tag = NULL;
        CATCH (!(server = net_server_create ("127.0.0.1", 8888,
                                             &server_on_connect,
                                             &server_on_error,
                                             NULL)));
        CATCH (!(client = net_client_create (&client_on_connect,
                                             &client_on_connect_error,
                                             &client_on_error,
                                             NULL)));
        connection.ip = "127.0.0.1";
        connection.port = 8888;
        net_client_connect (client, &connection);
        thread_signal_wait (&server_signal);
        CATCH (!(poll = net_poll_create (&on_monitor, &on_close, NULL, NULL)));
        poll_connection.socket = server_socket;
        CATCH (!net_poll_monitor (poll, &poll_connection));
        thread_signal_wait (&monitor_signal);
        CATCH (!monitor_success);
        CATCH (!net_poll_close (poll, &poll_connection));
        thread_signal_wait (&close_signal);
        CATCH (!close_success);
        net_poll_destroy (poll);
        close (server_socket);
        close (client_socket);
        net_server_destroy (server);
        net_client_destroy (client);
        CATCH (error_count () != 0);
        PASS ();
}
bool test_poll_write_2 (Test *test)
{
        NetPoll *poll;
        NetServer *server;
        NetClient *client;
        NetClientConnection connect;
        size_t i;

        TITLE ();
        poll_client.closed = false;
        poll_server.closed = false;
        read_count = 0;
        CATCH (!(server = net_server_create ("127.0.0.1", 8888,
                                             &server_on_connect,
                                             &server_on_error,
                                             NULL)));
        CATCH (!(client = net_client_create (&client_on_connect,
                                             &client_on_connect_error,
                                             &client_on_error,
                                             NULL)));
        CATCH (!(poll = net_poll_create (&poll_on_monitor, 
                                         &poll_on_close, 
                                         &poll_on_read,
                                         &poll_on_write)));

        // Allocate buffer
        CATCH (!(write_buffer = memory_create (BufferSize)));
        for (i = 0; i < BufferSize; i++) {
                write_buffer[i] = (unsigned char)i;
        }

        // Connect client.
        connect.ip = "127.0.0.1";
        connect.port = 8888;
        net_client_connect (client, &connect);

        // Wait for connections to be completed.
        thread_signal_wait (&client_connect_signal);
        thread_signal_wait (&server_connect_signal);

        // Poll client and server connection.
        poll_client.socket = client_socket;
        poll_server.socket = server_socket;
        CATCH (!net_poll_monitor (poll, &poll_client));
        CATCH (!net_poll_monitor (poll, &poll_server));

        // Wait for monitors to be completed.
        thread_signal_wait (&client_monitor_signal);
        thread_signal_wait (&server_monitor_signal);

        // Write and wait.
        CATCH (!net_poll_write (poll, &poll_server, write_buffer, BufferSize));
        thread_signal_wait (&client_read_signal);

        // We're done, let's close poll client.
        net_poll_close (poll, &poll_client);

        // Now wait for client and server poll to close.
        thread_signal_wait (&client_close_signal);
        thread_signal_wait (&server_close_signal);

        net_poll_destroy (poll);
        net_server_destroy (server);
        net_client_destroy (client);
        memory_destroy (write_buffer);
        CATCH (error_count () != 0);
        PASS ();
}
示例#8
0
bool test_write (Test *test)
{
        NetServer *server;
        NetClient *client;
        NetClientConnection connect;
        NetStream *stream_server;
        NetStream *stream_client;
        unsigned char *buffer = (unsigned char *)"x";
        size_t i;

        TITLE ();
        write_count = 2000;
        read_count = 0;
        CATCH (!(server = net_server_create ("127.0.0.1", 8888,
                                             &server_on_connect,
                                             &server_on_error,
                                             NULL)));
        CATCH (!(client = net_client_create (&client_on_connect,
                                             &client_on_connect_error,
                                             &client_on_error,
                                             NULL)));

        // Connect client.
        connect.ip = "127.0.0.1";
        connect.port = 8888;
        net_client_connect (client, &connect);

        // Wait for connections to be completed.
        thread_signal_wait (&client_connect_signal);
        thread_signal_wait (&server_connect_signal);

        // Create streams.
        CATCH (!(stream_server = net_stream_create (&server_stream_on_add, 
                                                    &server_stream_on_close, 
                                                    &server_stream_on_read,
                                                    NULL)));
        CATCH (!(stream_client = net_stream_create (&client_stream_on_add, 
                                                    &client_stream_on_close, 
                                                    NULL,
                                                    NULL)));

        // Add sockets to streams.
        CATCH (!net_stream_add (stream_server, server_socket));
        CATCH (!net_stream_add (stream_client, client_socket));

        // Wait for add to be completed.
        thread_signal_wait (&client_add_signal);
        thread_signal_wait (&server_add_signal);

        // Write 2000 times.
        for (i = 0; i < write_count; i++) {
                CATCH (!net_stream_write (stream_client, 
                                          stream_connection_client,
                                          buffer,
                                          1));
        }

        thread_signal_wait (&server_read_signal);

        // Close client connection, should cause server to close as well.
        net_stream_close (stream_client, stream_connection_client);

        // Wait for close to be completed.
        thread_signal_wait (&client_close_signal);
        thread_signal_wait (&server_close_signal);

        // Remove closed streams.
        net_stream_remove (stream_server, stream_connection_server);
        net_stream_remove (stream_client, stream_connection_client);

        // We're done, let's destroy streams.
        net_stream_destroy (stream_server);
        net_stream_destroy (stream_client);

        net_server_destroy (server);
        net_client_destroy (client);
        CATCH (error_count () != 0);
        PASS ();
}