Simple Server Sample in C

The simple HTTP server sample demonstrates how to add HTTP server functionality to your C application.

The sample is a multithreaded main program that listens on port 8888 for HTTP requests. By changing the value of the ThreadLimit directive in the configuration file to zero you can run single-threaded.

See also the equivalent C++ simpleServer sample.

Files

simpleServer.conf
Makefile
simpleServer.c

Configuration File

simpleServer.conf

DocumentRoot "."
Listen 8888
ThreadLimit 4
AddHandler copyHandler


This file is an AppWeb configuration file. It is configured to run single-threaded and assumes that the sample is being run from the current directory.

You should modify the DocumentRoot and Listen directives to suit your application's needs.

Makefile

The Makefile will build on Windows or Linux. A Windows VS 6.0 project file is also supplied.

Typical output from the Makefile build is listed below. This is the output on a Windows system:

cl -o simpleServer.exe simpleServer.c -Zi -Od -D_NDEBUG -W3 -nologo -MDd -FD -DWIN -D_DLL -D_MT \
  -D_WINDOWS -DWIN32 -D_WIN32_WINNT=0x500 -D_X86_=1 -D_CRT_SECURE_NO_DEPRECATE -D_USRDLL \
  -I../../../include  ../../../bin/libappwebStatic.lib ws2_32.lib advapi32.lib user32.lib

Source Code

simpleServer.c

/*
 *  @file   simpleServer.c
 *  @brief  Embed the AppWeb server in a simple multi-threaded C
 *          language application.
 *  Copyright (c) Mbedthis Software LLC, 2003-2007. All Rights Reserved.
 */
 
/******************************* Includes *****************************/

#define     UNSAFE_FUNCTIONS_OK 1

#include    "appweb/appweb.h"

/********************************* Code *******************************/
#if BLD_FEATURE_C_API_MODULE

int main(int argc, char** argv)
{
    MaHttp      *http;      /* For the http service inside our app */
    MaServer    *server;    /* For a HTTP server */

    /*
     *  Initialize the run-time and give our app a name "simpleServer"
     */
    mprCreateMpr("simpleServer");

    /*
     *  Do the following two statements only if you want debug trace
     */
    mprAddLogFileListener();
    mprSetLogSpec("stdout:4");

    /*
     *  Start run-time services
     */
    mprStartMpr(0);

    /*
     *  Create the HTTP and server objects. Give the server a name 
     *  "default" and define "." as the default serverRoot, ie. the 
     *  directory with the server configuration files.
     */
    http = maCreateHttp();
    server = maCreateServer(http, "default", ".");
    
    /*
     *  Activate the copy handler. Only needed when linking statically.
     */
    mprCopyInit(0);

    /*
     *  Configure the server based on the directives in 
     *  simpleServer.conf.
     */
    if (maConfigureServer(server, "simpleServer.conf") < 0) {
        fprintf(stderr, 
            "Can't configure the server. Error on line %d\n", 
            maGetConfigErrorLine(server));
        exit(2);
    }

    /*
     *  Start serving pages. After this we are live.
     */
    if (maStartServers(http) < 0) {
        fprintf(stderr, "Can't start the server\n");
        exit(2);
    }

    /*
     *  Service events. This call will block until the server is exited
     *  Call mprTerminate() at any time to instruct the server to exit.
     *  The -1 is a timeout on the block. Useful if you use 
     *  MPR_LOOP_ONCE and have a polling event loop.
     */
    mprServiceEvents(MPR_LOOP_FOREVER, -1);

    /*
     *  Stop all HTTP services
     */
    maStopServers(http);

    /*
     *  Delete the server and http objects
     */
    maDeleteServer(server);
    maDeleteHttp(http);

    /*
     *  Stop and delete the run-time services
     */
    mprStopMpr();
    mprDeleteMpr();

    return 0;
}

/**********************************************************************/
#else /* BLD_FEATURE_C_API_MODULE */

int main()
{
    fprintf(stderr, "BLD_FEATURE_C_API_MODULE is not defined in config.h\n");
    exit(2);
}
#endif /* BLD_FEATURE_C_API_MODULE */

© Mbedthis Software LLC, 2003-2006. All rights reserved. Mbedthis is a trademark of Mbedthis Software LLC.