小型的嵌入式 HTTP 服务器 GNU libmicrohttpd 0.9.21 发布
openkk 12年前
<p>GNU libmicrohttpd 0.9.21 发布,<a href="/misc/goto?guid=4958191990410054786" target="_blank">GNU libmicrohttpd </a>是一个小型的嵌入式 HTTP 服务器 的 C 类库,支持 HTTP 1.1 可以同时侦听多个端口。</p> <ul> <li>C library: fast and small</li> <li>API is simple, expressive and fully reentrant</li> <li>Implementation is HTTP 1.1 compliant</li> <li>HTTP server can listen on multiple ports</li> <li>Four different threading models (select, poll, pthread, thread pool)</li> <li>Supported platforms include GNU/Linux, FreeBSD, OpenBSD, NetBSD, OS X, W32, Symbian and z/OS</li> <li>Support for IPv6</li> <li>Support for SHOUTcast</li> <li>Support for incremental processing of POST data (optional)</li> <li>Support for basic and digest authentication (optional)</li> <li>Support for SSL3 and TLS (requires libgcrypt and libgnutls, optional)</li> <li>Binary is only about 32k (without TLS/SSL support and other optional features)</li> </ul> <p>下面是一个最为简单的使用例子:</p> <pre class="brush:cpp; toolbar: true; auto-links: false;">#include <microhttpd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define PAGE "<html><head><title>libmicrohttpd demo</title>"\ "</head><body>libmicrohttpd demo</body></html>" static int ahc_echo(void * cls, struct MHD_Connection * connection, const char * url, const char * method, const char * version, const char * upload_data, size_t * upload_data_size, void ** ptr) { static int dummy; const char * page = cls; struct MHD_Response * response; int ret; if (0 != strcmp(method, "GET")) return MHD_NO; /* unexpected method */ if (&dummy != *ptr) { /* The first time only the headers are valid, do not respond in the first round... */ *ptr = &dummy; return MHD_YES; } if (0 != *upload_data_size) return MHD_NO; /* upload data in a GET!? */ *ptr = NULL; /* clear context pointer */ response = MHD_create_response_from_data(strlen(page), (void*) page, MHD_NO, MHD_NO); ret = MHD_queue_response(connection, MHD_HTTP_OK, response); MHD_destroy_response(response); return ret; } int main(int argc, char ** argv) { struct MHD_Daemon * d; if (argc != 2) { printf("%s PORT\n", argv[0]); return 1; } d = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION, atoi(argv[1]), NULL, NULL, &ahc_echo, PAGE, MHD_OPTION_END); if (d == NULL) return 1; (void) getc (); MHD_stop_daemon(d); return 0; }</pre> <p>0.9.21:</p> <p>This release fixes potential problems with non-monotonic increasing system time values, makes sockets non-inheritable by default, and enables MHD to operate without a "listen"<span class="truncate_more"> socket (for special circumstances).</span></p>