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.

Reply via email to