The Passionate Craftsman

Ruby, PHP, MySql, Software engineering and more.

Saturday, 4 February 2012

G-WAN World's fastest web server for C scripts

UPDATE: The forum of the web site has been closed  few months ago. There is not any active community and actually there are very few people supporting the idea that G-WAN is very fast.

After my previous post on CGI, I continued to search for a FastCGI example written in C, for the Mac and nginx. There is a post about it, but it was not working. However I found an awesome project, G-WAN, a web server built in ANSI C, super fast, at least from the charts reported on the web site. Another fantastic feature that G-WAN has, is the possibility to write C scripts, yes scripts! You put your scripts in a directory and when the script is called from the browser it is compiled and served. G-WAN can serve hundreds of thousands of connections per second but the response time is much better than any other language and application server.

This is a Hello World! example, the code does not has to be compiled:

// ============================================================================
// C servlet sample for the G-WAN Web Application Server (
// ----------------------------------------------------------------------------
// hello.c: just used with Lighty's Weighttp to benchmark a minimalist servlet
// ============================================================================
// imported functions:
//   get_reply(): get a pointer on the 'reply' dynamic buffer from the server
//    xbuf_cat(): like strcat(), but it works in the specified dynamic buffer
// ----------------------------------------------------------------------------
#include "gwan.h" // G-WAN exported functions

int main(int argc, char *argv[])
   xbuf_cat(get_reply(argv), "Hello World!");
   return 200; // return an HTTP code (200:'OK')
// ============================================================================
// End of Source Code
// ============================================================================

Now start the server:

sudo ./gwan

and enjoy: http://localhost:8080/csp?hello1.c

I wonder if, in a near future, we will have a super fast REST backend with a thick Javascript interface made with Backbone.js and JQuery.

Labels: ,

Friday, 3 February 2012

CGI script with Apache and C programming language

Dynamic web pages where born in 1993 when CGI was introduced. The most common language used was Perl, but C was used too. Today I just tried to write a CGI script for the first time in my life and I did it with C, like a real man. Find your CGI path, mine is:

$ sudo cat /etc/apache2/httpd.conf | grep ScriptAlias
ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"

So in my Mac I can put my CGI scripts here: /Library/WebServer/CGI-Executables/.

I created a file, test.c with this content:


int main(void) {
printf("Content-Type: text/plain;charset=us-ascii\n\n");
printf("Hello world\n\n");
printf("The C programming language\n\n");

time_t now;
struct tm *d;
char li[13];
d = localtime(&now);
strftime(li, 15, "%d/%m/%Y", d);
printf("Today is %s\n", li);

return 0;

I compiled the file and made it executable:

cc testc.c -o testc && chmod +x testc

And is saw the outcome here http://localhost/cgi-bin/testc.

This is the output:

Hello world

The C programming language

Today is 03/02/2012

CGI is very simple, you just need to print the content type with newline and carriage return, then you can output your dynamic HTML content.

Today FastCGI has replaced CGI and it is very popular and probably it is the best way to create dynamic web pages with the most performance possible: C + FastCGI. Another option, more sophisticated and with different way of use it is uWSGI, created by the Italian hosting company Yesterday I read an article about the usage of C++ as programming language for Facebook, in 2009 they could shutdown 22500 servers if they where using C++ instead of PHP. We all know that Facebook has created a PHP compiler to compile PHP in C++: HipHop

P.S.: charset shout be UTF-8 :-)

Labels: , ,