Files
graphene/Pal/test/Server.c
T
Chia-Che Tsai 7f19f62f31 beta version 0.2
Plenty of bugfixes for Linux kernel later than 3.5 and Ubuntu later than 10.10.
More organized code to improve portability.
Regression tests for Pal to test completeness of implementation.
2015-05-20 14:15:52 -04:00

97 lines
2.4 KiB
C

/* -*- 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;
}