示例#1
0
int handle_client(client_t* cl,mp_net_stream_packet_t* pack) {

  if(!pack)
    return 0;
 
  switch(pack->cmd) {
  case NET_STREAM_OPEN:
    if(((char*)pack)[pack->len-1] != '\0') {
      mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid open packet\n");
      return 0;
    }
    return net_stream_open(cl,pack->data);
  case NET_STREAM_FILL_BUFFER:
    if(pack->len != sizeof(mp_net_stream_packet_t) + 2) {
      mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid fill buffer packet\n");
      return 0;
    }
    return net_stream_fill_buffer(cl,le2me_16(*((uint16_t*)pack->data)));
  case NET_STREAM_SEEK:
    if(pack->len != sizeof(mp_net_stream_packet_t) + 8) {
      mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid fill buffer packet\n");
      return 0;
    }
    return net_stream_seek(cl,le2me_64(*((uint64_t*)pack->data)));
  case NET_STREAM_RESET:
    return net_stream_reset(cl);
  case NET_STREAM_CLOSE:
    if(pack->len != sizeof(mp_net_stream_packet_t)){
      mp_msg(MSGT_NETST,MSGL_WARN,"Got invalid fill buffer packet\n");
      return 0;
    }
    return net_stream_close(cl);
  default:
    mp_msg(MSGT_NETST,MSGL_WARN,"Got unknown command %d\n",pack->cmd);
    if(!write_error(cl->fd,"Unknown command\n"))
      return 0;
  }
  return 0;
}
示例#2
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 ();
}