ipc.rs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. use docopt::Docopt;
  2. use hbb_common::{
  3. env_logger::{init_from_env, Env, DEFAULT_FILTER_ENV},
  4. log, tokio,
  5. };
  6. use librustdesk::{ipc::Data, *};
  7. const USAGE: &'static str = "
  8. IPC test program.
  9. Usage:
  10. ipc (-s | --server | -c | --client) [-p <str> | --postfix=<str>]
  11. ipc (-h | --help)
  12. Options:
  13. -h --help Show this screen.
  14. -s --server Run as IPC server.
  15. -c --client Run as IPC client.
  16. -p --postfix=<str> IPC path postfix [default: ].
  17. ";
  18. #[derive(Debug, serde::Deserialize)]
  19. struct Args {
  20. flag_server: bool,
  21. flag_client: bool,
  22. flag_postfix: String,
  23. }
  24. #[tokio::main]
  25. async fn main() {
  26. init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "info"));
  27. let args: Args = Docopt::new(USAGE)
  28. .and_then(|d| d.deserialize())
  29. .unwrap_or_else(|e| e.exit());
  30. if args.flag_server {
  31. if args.flag_postfix.is_empty() {
  32. log::info!("Starting IPC server...");
  33. } else {
  34. log::info!(
  35. "Starting IPC server with postfix: '{}'...",
  36. args.flag_postfix
  37. );
  38. }
  39. ipc_server(&args.flag_postfix).await;
  40. } else if args.flag_client {
  41. if args.flag_postfix.is_empty() {
  42. log::info!("Starting IPC client...");
  43. } else {
  44. log::info!(
  45. "Starting IPC client with postfix: '{}'...",
  46. args.flag_postfix
  47. );
  48. }
  49. ipc_client(&args.flag_postfix).await;
  50. }
  51. }
  52. async fn ipc_server(postfix: &str) {
  53. let postfix = postfix.to_string();
  54. let postfix2 = postfix.clone();
  55. std::thread::spawn(move || {
  56. if let Err(err) = crate::ipc::start(&postfix) {
  57. log::error!("Failed to start ipc: {}", err);
  58. std::process::exit(-1);
  59. }
  60. });
  61. tokio::time::sleep(std::time::Duration::from_secs(1)).await;
  62. ipc_client(&postfix2).await;
  63. }
  64. async fn ipc_client(postfix: &str) {
  65. loop {
  66. match crate::ipc::connect(1000, postfix).await {
  67. Ok(mut conn) => match conn.send(&Data::Empty).await {
  68. Ok(_) => {
  69. log::info!("send message to ipc server success");
  70. }
  71. Err(e) => {
  72. log::error!("Failed to send message to ipc server: {}", e);
  73. }
  74. },
  75. Err(e) => {
  76. log::error!("Failed to connect to ipc server: {}", e);
  77. }
  78. }
  79. tokio::time::sleep(std::time::Duration::from_secs(6)).await;
  80. }
  81. }