| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 
 | #include <stdio.h>#include <stdlib.h>
 #include <string.h>
 #include <uv.h>
 
 #define PORT 7000
 #define BUFFER_SIZE 1024
 
 
 void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
 {
 buf->base = (char *)malloc(suggested_size);
 buf->len = suggested_size;
 }
 
 
 void on_close(uv_handle_t *handle)
 {
 free(handle);
 }
 
 
 void echo_write(uv_write_t *req, int status)
 {
 if (status < 0)
 {
 fprintf(stderr, "Write error %s\n", uv_strerror(status));
 }
 free(req->data);
 free(req);
 }
 
 
 void on_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf)
 {
 if (nread > 0)
 {
 uv_write_t *req = (uv_write_t *)malloc(sizeof(uv_write_t));
 uv_buf_t wrbuf = uv_buf_init(buf->base, nread);
 req->data = buf->base;
 
 uv_write(req, client, &wrbuf, 1, echo_write);
 return;
 }
 else if (nread < 0)
 {
 if (nread != UV_EOF)
 fprintf(stderr, "Read error %s\n", uv_err_name(nread));
 uv_close((uv_handle_t *)client, on_close);
 }
 
 free(buf->base);
 }
 
 
 void on_new_connection(uv_stream_t *server, int status)
 {
 if (status < 0)
 {
 fprintf(stderr, "New connection error %s\n", uv_strerror(status));
 return;
 }
 
 uv_tcp_t *client = (uv_tcp_t *)malloc(sizeof(uv_tcp_t));
 uv_tcp_init(server->loop, client);
 
 if (uv_accept(server, (uv_stream_t *)client) == 0)
 {
 uv_read_start((uv_stream_t *)client, alloc_buffer, on_read);
 }
 else
 {
 uv_close((uv_handle_t *)client, on_close);
 }
 }
 
 int main()
 {
 uv_loop_t *loop = uv_default_loop();
 
 uv_tcp_t server;
 uv_tcp_init(loop, &server);
 
 struct sockaddr_in addr;
 uv_ip4_addr("0.0.0.0", PORT, &addr);
 
 uv_tcp_bind(&server, (const struct sockaddr *)&addr, 0);
 int r = uv_listen((uv_stream_t *)&server, 128, on_new_connection);
 
 if (r)
 {
 fprintf(stderr, "Listen error %s\n", uv_strerror(r));
 return 1;
 }
 
 printf("Echo server listening on port %d...\n", PORT);
 return uv_run(loop, UV_RUN_DEFAULT);
 }
 
 |