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; }
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 (); }