libuv/docs/code/pipe-echo-server/main.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <uv.h>
5 
6 #ifdef _WIN32
7 #define PIPENAME "\\\\?\\pipe\\echo.sock"
8 #else
9 #define PIPENAME "/tmp/echo.sock"
10 #endif
11 
13 
14 typedef struct {
16  uv_buf_t buf;
17 } write_req_t;
18 
20  write_req_t *wr = (write_req_t*) req;
21  free(wr->buf.base);
22  free(wr);
23 }
24 
25 void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
26  buf->base = malloc(suggested_size);
27  buf->len = suggested_size;
28 }
29 
31  if (status < 0) {
32  fprintf(stderr, "Write error %s\n", uv_err_name(status));
33  }
35 }
36 
38  if (nread > 0) {
39  write_req_t *req = (write_req_t*) malloc(sizeof(write_req_t));
40  req->buf = uv_buf_init(buf->base, nread);
41  uv_write((uv_write_t*) req, client, &req->buf, 1, echo_write);
42  return;
43  }
44 
45  if (nread < 0) {
46  if (nread != UV_EOF)
47  fprintf(stderr, "Read error %s\n", uv_err_name(nread));
48  uv_close((uv_handle_t*) client, NULL);
49  }
50 
51  free(buf->base);
52 }
53 
55  if (status == -1) {
56  // error!
57  return;
58  }
59 
60  uv_pipe_t *client = (uv_pipe_t*) malloc(sizeof(uv_pipe_t));
62  if (uv_accept(server, (uv_stream_t*) client) == 0) {
64  }
65  else {
66  uv_close((uv_handle_t*) client, NULL);
67  }
68 }
69 
70 void remove_sock(int sig) {
71  uv_fs_t req;
72  uv_fs_unlink(loop, &req, PIPENAME, NULL);
73  exit(0);
74 }
75 
76 int main() {
78 
80  uv_pipe_init(loop, &server, 0);
81 
82  signal(SIGINT, remove_sock);
83 
84  int r;
85  if ((r = uv_pipe_bind(&server, PIPENAME))) {
86  fprintf(stderr, "Bind error %s\n", uv_err_name(r));
87  return 1;
88  }
89  if ((r = uv_listen((uv_stream_t*) &server, 128, on_new_connection))) {
90  fprintf(stderr, "Listen error %s\n", uv_err_name(r));
91  return 2;
92  }
93  return uv_run(loop, UV_RUN_DEFAULT);
94 }
echo_read
void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf)
Definition: libuv/docs/code/pipe-echo-server/main.c:37
uv_pipe_init
UV_EXTERN int uv_pipe_init(uv_loop_t *, uv_pipe_t *handle, int ipc)
Definition: unix/pipe.c:33
client
Definition: examples/python/async_streaming/client.py:1
free_write_req
void free_write_req(uv_write_t *req)
Definition: libuv/docs/code/pipe-echo-server/main.c:19
string.h
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
uv_listen
UV_EXTERN int uv_listen(uv_stream_t *stream, int backlog, uv_connection_cb cb)
Definition: unix/stream.c:656
PIPENAME
#define PIPENAME
Definition: libuv/docs/code/pipe-echo-server/main.c:9
write_req_t
Definition: worker.c:11
status
absl::Status status
Definition: rls.cc:251
uv_run
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition: unix/core.c:361
uv_fs_s
Definition: uv.h:1294
python_utils.port_server.stderr
stderr
Definition: port_server.py:51
uv_close
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition: unix/core.c:112
echo_write
void echo_write(uv_write_t *req, int status)
Definition: libuv/docs/code/pipe-echo-server/main.c:30
uv_stream_s
Definition: uv.h:491
uv_fs_unlink
UV_EXTERN int uv_fs_unlink(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)
Definition: unix/fs.c:1974
loop
uv_loop_t * loop
Definition: libuv/docs/code/pipe-echo-server/main.c:12
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
uv_default_loop
UV_EXTERN uv_loop_t * uv_default_loop(void)
Definition: uv-common.c:733
ssize_t
intptr_t ssize_t
Definition: win.h:27
signal
static void signal(notification *n)
Definition: alts_tsi_handshaker_test.cc:107
uv_write
UV_EXTERN int uv_write(uv_write_t *req, uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb)
Definition: unix/stream.c:1492
req
static uv_connect_t req
Definition: test-connection-fail.c:30
UV_RUN_DEFAULT
@ UV_RUN_DEFAULT
Definition: uv.h:254
remove_sock
void remove_sock(int sig)
Definition: libuv/docs/code/pipe-echo-server/main.c:70
uv_read_start
UV_EXTERN int uv_read_start(uv_stream_t *, uv_alloc_cb alloc_cb, uv_read_cb read_cb)
Definition: unix/stream.c:1555
alloc_buffer
void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: libuv/docs/code/pipe-echo-server/main.c:25
uv_accept
UV_EXTERN int uv_accept(uv_stream_t *server, uv_stream_t *client)
Definition: unix/stream.c:591
uv_buf_t::base
char * base
Definition: unix.h:122
uv.h
uv_buf_t
Definition: unix.h:121
server
Definition: examples/python/async_streaming/server.py:1
fix_build_deps.r
r
Definition: fix_build_deps.py:491
write_req_t::buf
uv_buf_t buf
Definition: worker.c:13
uv_pipe_s
Definition: uv.h:757
uv_buf_init
UV_EXTERN uv_buf_t uv_buf_init(char *base, unsigned int len)
Definition: uv-common.c:157
uv_write_s
Definition: uv.h:522
handle
static csh handle
Definition: test_arm_regression.c:16
uv_handle_s
Definition: uv.h:441
uv_loop_s
Definition: uv.h:1767
main
int main()
Definition: libuv/docs/code/pipe-echo-server/main.c:76
uv_pipe_bind
UV_EXTERN int uv_pipe_bind(uv_pipe_t *handle, const char *name)
Definition: unix/pipe.c:43
on_new_connection
void on_new_connection(uv_stream_t *server, int status)
Definition: libuv/docs/code/pipe-echo-server/main.c:54
uv_err_name
const UV_EXTERN char * uv_err_name(int err)
Definition: uv-common.c:189


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:17