Skip to content

Instantly share code, notes, and snippets.

Created August 23, 2014 23:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/49a46b15272d3ae83b97 to your computer and use it in GitHub Desktop.
Save anonymous/49a46b15272d3ae83b97 to your computer and use it in GitHub Desktop.
Benchmarking - libuv
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>
const int backlog = 128;
static const char* MESSAGE = \
"HTTP/1.1 200 OK\r\n" \
"Content-Type: text/html; charset=utf-8\r\n" \
"content-length: 21\r\n\r\n" \
"<h1>Test content</h1>";
static void on_close(uv_handle_t* handle) {
free(handle);
}
static void on_client_write(uv_write_t *req, int status) {
if (status == -1) {
printf("Failed sending response\n");
}
// Don't need to free our (static) buffer.
if (!uv_is_closing((uv_handle_t*)req->handle)) {
uv_close((uv_handle_t*)req->handle, on_close);
}
free(req);
}
static void on_new_connection(uv_stream_t *server, int status) {
if (status == -1) {
printf("Error listening\n");
uv_close((uv_handle_t*)server, NULL);
return;
}
uv_stream_t* stream = (uv_stream_t*)malloc(sizeof(uv_tcp_t));
uv_tcp_init(uv_default_loop(), (uv_tcp_t*)stream);
stream->data = server;
int result = uv_accept(server, stream);
if (result == 0) {
uv_write_t* req = (uv_write_t*)malloc(sizeof *req);
uv_buf_t bufs[] = {
uv_buf_init((char*)MESSAGE, strlen(MESSAGE)),
};
result = uv_write(req, stream, bufs, 1, on_client_write);
if (result) {
printf("Failed sending response: %s\n", uv_err_name(result));
}
} else {
uv_close((uv_handle_t*)stream, NULL);
}
}
int main(void) {
uv_tcp_t server;
struct sockaddr_in bind_addr;
int r;
r = uv_ip4_addr("127.0.0.1", 8080, &bind_addr);
if (r) {
goto err;
}
r = uv_tcp_init(uv_default_loop(), &server);
if (r) {
goto err;
}
r = uv_tcp_bind(&server, (const struct sockaddr*)&bind_addr, 0);
if (r) {
goto err;
}
r = uv_listen((uv_stream_t*)&server, backlog, on_new_connection);
if (r) {
goto err;
}
printf("Listening for connections on port %d\n", 8080);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
err:
printf("Error listening: %s\n", uv_err_name(r));
return 1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment