| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | /* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- *//* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: *//* The server test program that accept multiple TCP connection at the same * time. A port number is taken as argument. If a port is locked up, try * another one.  *  * Run this progam with a simple tcp client, like netcat.  For instance: * * Start the server: *  ../src/libpal.so file:./Server.manifest 4000 * * * Run the client: *   nc localhost 4000 *   [ type strings here, see them appear on the console ] */#include "pal.h"#include "pal_debug.h"#include "api.h"int main (int argc, char ** argv){    if (argc < 2) {        pal_printf("specify the port to open\n");        return 0;    }    char uri[60];    snprintf(uri, 60, "tcp.srv:127.0.0.1:%s", argv[1]);    PAL_HANDLE srv = DkStreamOpen(uri, PAL_ACCESS_RDWR, 0,                                  PAL_CREAT_TRY, 0);    if (srv == NULL) {        pal_printf("DkStreamOpen failed\n");        return -1;    }    void * buffer = (void *) DkVirtualMemoryAlloc(NULL, 4096, 0,                                                  PAL_PROT_READ|PAL_PROT_WRITE);    if (!buffer) {        pal_printf("DkVirtualMemoryAlloc failed\n");        return -1;    }    PAL_HANDLE hdls[8];    int nhdls = 1, i;    hdls[0] = srv;    while(1) {        PAL_HANDLE hdl = DkObjectsWaitAny(nhdls, hdls, NO_TIMEOUT);        if (!hdl)            continue;        if (hdl == srv) {            hdl = DkStreamWaitForClient(srv);            if (!hdl)                continue;            if (nhdls >= 8) {                pal_printf("[ ] connection rejected\n");                DkObjectClose(hdl);                continue;            }            pal_printf("[%d] receive new connection\n", nhdls);            hdls[nhdls++] = hdl;            continue;        }        int cnt = 0;        for (i = 0 ; i < nhdls ; i++)            if (hdls[i] == hdl)                cnt = i;        int bytes = DkStreamRead(hdl, 0, 4096, buffer, NULL, 0);        if (bytes == 0) {            DkObjectClose(hdls[cnt]);            if (cnt != nhdls - 1)                hdls[cnt] = hdls[nhdls - 1];            nhdls--;            continue;        }        ((char *) buffer)[bytes] = 0;        pal_printf("[%d] %s", cnt, (char *) buffer);    }    return 0;}
 |