main.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <uv.h>
  5. #ifdef _WIN32
  6. #define PIPENAME "\\\\?\\pipe\\echo.sock"
  7. #else
  8. #define PIPENAME "/tmp/echo.sock"
  9. #endif
  10. uv_loop_t *loop;
  11. typedef struct {
  12. uv_write_t req;
  13. uv_buf_t buf;
  14. } write_req_t;
  15. void free_write_req(uv_write_t *req) {
  16. write_req_t *wr = (write_req_t*) req;
  17. free(wr->buf.base);
  18. free(wr);
  19. }
  20. void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
  21. buf->base = malloc(suggested_size);
  22. buf->len = suggested_size;
  23. }
  24. void echo_write(uv_write_t *req, int status) {
  25. if (status < 0) {
  26. fprintf(stderr, "Write error %s\n", uv_err_name(status));
  27. }
  28. free_write_req(req);
  29. }
  30. void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
  31. if (nread > 0) {
  32. write_req_t *req = (write_req_t*) malloc(sizeof(write_req_t));
  33. req->buf = uv_buf_init(buf->base, nread);
  34. uv_write((uv_write_t*) req, client, &req->buf, 1, echo_write);
  35. return;
  36. }
  37. if (nread < 0) {
  38. if (nread != UV_EOF)
  39. fprintf(stderr, "Read error %s\n", uv_err_name(nread));
  40. uv_close((uv_handle_t*) client, NULL);
  41. }
  42. free(buf->base);
  43. }
  44. void on_new_connection(uv_stream_t *server, int status) {
  45. if (status == -1) {
  46. // error!
  47. return;
  48. }
  49. uv_pipe_t *client = (uv_pipe_t*) malloc(sizeof(uv_pipe_t));
  50. uv_pipe_init(loop, client, 0);
  51. if (uv_accept(server, (uv_stream_t*) client) == 0) {
  52. uv_read_start((uv_stream_t*) client, alloc_buffer, echo_read);
  53. }
  54. else {
  55. uv_close((uv_handle_t*) client, NULL);
  56. }
  57. }
  58. void remove_sock(int sig) {
  59. uv_fs_t req;
  60. uv_fs_unlink(loop, &req, PIPENAME, NULL);
  61. exit(0);
  62. }
  63. int main() {
  64. loop = uv_default_loop();
  65. uv_pipe_t server;
  66. uv_pipe_init(loop, &server, 0);
  67. signal(SIGINT, remove_sock);
  68. int r;
  69. if ((r = uv_pipe_bind(&server, PIPENAME))) {
  70. fprintf(stderr, "Bind error %s\n", uv_err_name(r));
  71. return 1;
  72. }
  73. if ((r = uv_listen((uv_stream_t*) &server, 128, on_new_connection))) {
  74. fprintf(stderr, "Listen error %s\n", uv_err_name(r));
  75. return 2;
  76. }
  77. return uv_run(loop, UV_RUN_DEFAULT);
  78. }