Created
August 23, 2014 23:32
-
-
Save anonymous/49a46b15272d3ae83b97 to your computer and use it in GitHub Desktop.
Benchmarking - libuv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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