Back to the full WebSockets listWhat are WebSockets?

GitHubStarsLast commitProject createdClosed vsOpen issues
2 years ago
7 years ago
53 / 20

GitHub Build Status Codacy Badge codecov is a C micro-framework for web applications. includes: provides high performance TCP/IP network services to Linux / BSD (and macOS) by using an evented design (as well as thread pool and forking support) and provides an easy solution to the C10K problem.

You can read more about on the website.

Important to Note

The master branch on the git repo is the development branch and is likely to be broken at any given time (especially when working on major revisions, as I am at the moment).

Please select a release version for any production needs.

Who's running on

An HTTP example

#include "http.h" /* the HTTP extension */

// We'll use this callback in `http_listen`, to handles HTTP requests
void on_request(http_s *request);

// These will contain pre-allocated values that we will use often

// Listen to HTTP requests and start
int main(int argc, char const **argv) {
  // allocating values we use often
  HTTP_X_DATA = fiobj_str_new("X-Data", 6);
  // listen on port 3000 and any available network binding (NULL ==
  http_listen("3000", NULL, .on_request = on_request, .log = 1);
  // start the server
  facil_start(.threads = 1);
  // deallocating the common values

// Easy HTTP handling
void on_request(http_s *request) {
  http_set_cookie(request, .name = "my_cookie", .name_len = 9, .value = "data",
                  .value_len = 4);
  http_set_header(request, HTTP_HEADER_CONTENT_TYPE,
                  http_mimetype_find("txt", 3));
  http_set_header(request, HTTP_X_DATA, fiobj_str_new("my data", 7));
  http_send_body(request, "Hello World!\r\n", 14);

Using in your project

It's possible to either start a new project with or simply add it to an existing one. GNU make is the default build system and CMake is also supported. should be C99 compatible.

Starting a new project with

To start a new project using the framework, run the following command in the terminal (change appname to whatever you want):

 $ bash <(curl -s appname

You can review the script here. In short, it will create a new folder, download a copy of the stable branch, add some demo boiler plate code and run make clean (which is required to build the tmp folder structure).

Next, edit the makefile to remove any generic features you don't need, such as the DUMP_LIB feature, the DEBUG flag or the DISAMS disassembler and start development.

Credit to @benjcal for suggesting the script.

Notice: The master branch is the development branch. Please select the latest release tag for the latest stable release version.

Adding to an existing project is a source code library, so it's easy to copy the source code into an existing project and start using the library right away.

The make libdump command will dump all the relevant files in a single folder called libdump, and you can copy them all or divide them into header ands source files.

It's also possible to compile the library separately using the make lib command.

Using as a CMake submodule also supports both git and CMake submodules. Credit to @OwenDelahoy (PR#8).

First, add the repository as a submodule using git:

git submodule add

Then add the following line the project's CMakeLists.txt


Using with Meson is available at Meson Wrap DB.

First, install the wrap file:

meson wrap install facil

Then add the following line to your project's

facil_dep = subproject('facil').get_variable('facil_dep')

More Examples

The examples folder includes code examples for a telnet echo protocol, a Simple Hello World server, an example for Websocket pub/sub with (optional) Redis, etc'.

You can find more information on the website

Forking, Contributing and all that Jazz

The contribution guide can be found here.

Sure, why not. If you can add Solaris or Windows support to evio and sock, that could mean facil would become available for use on these platforms as well.

If you encounter any issues, open an issue (or, even better, a pull request with a fix) - that would be great :-)

Hit me up if you want to: