Hi, It seems the problem is that you're allocating the `uv_write_t req` in the stack.
br El mié., 12 feb. 2020 a las 14:00, nilsocket (<nilsoc...@gmail.com>) escribió: > #include <stdlib.h> > #include <uv.h> > > uv_loop_t* loop; > uv_tcp_t server; > struct sockaddr_in addr; > > void on_new_connection(uv_stream_t* server, int status); > void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* > buf); > void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); > void serve_client(uv_work_t* req); > void on_write(uv_write_t* req, int status); > > int main() { > int r; > > loop = uv_default_loop(); > > uv_tcp_init(loop, &server); > > uv_ip4_addr("0.0.0.0", 8080, &addr); > uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0); > > if ((r = uv_listen((uv_stream_t*)&server, 100, on_new_connection))) { > fprintf(stderr, "Listen error %s\n", uv_strerror(r)); > return 1; > } > > return uv_run(loop, UV_RUN_DEFAULT); > } > > 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(loop, client); > > if (uv_accept(server, (uv_stream_t*)client) == 0) { > uv_work_t* work_req = malloc(sizeof(uv_work_t)); > work_req->data = client; > uv_queue_work(client->loop, work_req, serve_client, NULL); > } > } > > void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* > buf) { > *buf = uv_buf_init((char*)malloc(suggested_size), suggested_size); > } > > void serve_client(uv_work_t* req) { > uv_read_start((uv_stream_t*)req->data, alloc_buffer, read_cb); > } > > void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { > if (nread < 0) { > if (nread == UV_EOF) { > uv_close((uv_handle_t*)stream, NULL); > } > } else if (nread > 0) { > uv_write_t req; > > uv_buf_t* tempBuf = malloc(sizeof(uv_buf_t)); > *tempBuf = *buf; > > req.data = tempBuf; > tempBuf->len = nread; > > uv_write(&req, stream, tempBuf, 1, on_write); > } else { > uv_close((uv_handle_t*)stream, NULL); > } > } > > void on_write(uv_write_t* req, int status) { > uv_buf_t* buf = (uv_buf_t*)req->data; > free(buf->base); > free(buf); > } > > This is a simple program, which echoes data back to client. > > But when I try to connect multiple connections at a time, it crashes, can > somebody tell me why it's crashing? > > I'm attaching a client program, which connects to server, to write and > read data(`hello`). > To run it: > go run main.go x > Where `x`, represents no.of concurrent connections. > > Thank you. > > -- > You received this message because you are subscribed to the Google Groups > "libuv" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to libuv+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/libuv/5a8a3da4-dc9d-4e92-81c8-5194a25402bc%40googlegroups.com > <https://groups.google.com/d/msgid/libuv/5a8a3da4-dc9d-4e92-81c8-5194a25402bc%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "libuv" group. To unsubscribe from this group and stop receiving emails from it, send an email to libuv+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/libuv/CAAJY-XNSkSFW43DXb%2BoNsvyu9WKCd%3DLSGWogB%3DKAURLmbibRoQ%40mail.gmail.com.