1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
/*
* Copyright (C) 2004 Steve Harris, Uwe Koloska
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* $Id: example_server.c,v 1.2 2005/04/25 21:46:46 xovo Exp $
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "lo/lo.h"
int done = 0;
void error(int num, const char *m, const char *path);
int generic_handler(const char *path, const char *types, lo_arg **argv,
int argc, void *data, void *user_data);
int foo_handler(const char *path, const char *types, lo_arg **argv, int argc,
void *data, void *user_data);
int quit_handler(const char *path, const char *types, lo_arg **argv, int argc,
void *data, void *user_data);
int main()
{
/* start a new server on port 7770 */
lo_server_thread st = lo_server_thread_new("7770", error);
/* add method that will match any path and args */
lo_server_thread_add_method(st, NULL, NULL, generic_handler, NULL);
/* add method that will match the path /foo/bar, with two numbers, coerced
* to float and int */
lo_server_thread_add_method(st, "/foo/bar", "fi", foo_handler, NULL);
/* add method that will match the path /quit with no args */
lo_server_thread_add_method(st, "/quit", "", quit_handler, NULL);
lo_server_thread_start(st);
while (!done) {
#ifdef WIN32
Sleep(1);
#else
usleep(1000);
#endif
}
return 0;
}
void error(int num, const char *msg, const char *path)
{
printf("liblo server error %d in path %s: %s\n", num, path, msg);
fflush(stdout);
}
/* catch any incoming messages and display them. returning 1 means that the
* message has not been fully handled and the server should try other methods */
int generic_handler(const char *path, const char *types, lo_arg **argv,
int argc, void *data, void *user_data)
{
int i;
printf("path: <%s>\n", path);
for (i=0; i<argc; i++) {
printf("arg %d '%c' ", i, types[i]);
lo_arg_pp(types[i], argv[i]);
printf("\n");
}
printf("\n");
fflush(stdout);
return 1;
}
int foo_handler(const char *path, const char *types, lo_arg **argv, int argc,
void *data, void *user_data)
{
/* example showing pulling the argument values out of the argv array */
printf("%s <- f:%f, i:%d\n\n", path, argv[0]->f, argv[1]->i);
fflush(stdout);
return 0;
}
int quit_handler(const char *path, const char *types, lo_arg **argv, int argc,
void *data, void *user_data)
{
done = 1;
printf("quiting\n\n");
fflush(stdout);
return 0;
}
/* vi:set ts=8 sts=4 sw=4: */
|