void *zmqthread(void *data){ void *context = zmq_ctx_new (); void *subscriber = zmq_socket (context, ZMQ_SUB); void *buffer = (void *) malloc(MAXOSCSZ); int rc = zmq_connect (subscriber, ZEROMQ); lo_server s = lo_server_new("7772", error); lo_server_add_method(s, "/play", "iisffffffsffffi", play_handler, NULL ); lo_server_add_method(s, "/kriole", "iifff", kriole_handler, NULL ); lo_server_add_method(s, NULL, NULL, generic_handler, NULL); assert(rc == 0); // Subscribe to all rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, NULL, 0); assert (rc == 0); while(1) { int size = zmq_recv(subscriber, buffer, MAXOSCSZ, 0); if (size > 0) { lo_server_dispatch_data(s, buffer, size); } else { printf("oops.\n"); } } return(NULL); }
int main (int argc, char *argv []) { void *context = zmq_ctx_new (); void *subscriber = zmq_socket (context, ZMQ_SUB); void *buffer = (void *) malloc(MAXSZ); lo_message msg; int rc = zmq_connect (subscriber, "tcp://localhost:5556"); assert (rc == 0); // Subscribe to all rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, NULL, 0); assert (rc == 0); osc_init(); while(1) { int size = zmq_recv(subscriber, buffer, MAXSZ, 0); msg = (lo_message) buffer; if (size > 0) { printf("received a message that's %d big\n", size); lo_server_dispatch_data(s, buffer, size); } else { printf("oops.\n"); } } zmq_close (subscriber); zmq_ctx_destroy (context); return 0; }
int lo_server_recv(lo_server s) { void *data; size_t size; double sched_time = lo_server_next_event_delay(s); int i; #ifdef HAVE_SELECT #ifndef HAVE_POLL fd_set ps; struct timeval stimeout; int res,nfds=0; #endif #endif again: if (sched_time > 0.01) { if (sched_time > 10.0) { sched_time = 10.0; } #ifdef HAVE_POLL for (i=0; i < s->sockets_len; i++) { s->sockets[i].events = POLLIN | POLLPRI | POLLERR | POLLHUP; s->sockets[i].revents = 0; } poll(s->sockets, s->sockets_len, (int)(sched_time * 1000.0)); for (i=0; i < s->sockets_len; i++) { if ( s->sockets[i].revents == POLLERR || s->sockets[i].revents == POLLHUP) return 0; if (s->sockets[i].revents) break; } if (i >= s->sockets_len) { sched_time = lo_server_next_event_delay(s); if (sched_time > 0.01) goto again; return dispatch_queued(s); } #else #ifdef HAVE_SELECT if(!initWSock()) return 0; FD_ZERO(&ps); for (i=0; i < s->sockets_len; i++) { FD_SET(s->sockets[i].fd,&ps); if (s->sockets[i].fd > nfds) nfds = s->sockets[i].fd; } stimeout.tv_sec = sched_time; stimeout.tv_usec = (sched_time-stimeout.tv_sec)*1.e6; res = select(nfds+1,&ps,NULL,NULL,&stimeout); if(res == SOCKET_ERROR) { return 0; } if(!res) { sched_time = lo_server_next_event_delay(s); if (sched_time > 0.01) goto again; return dispatch_queued(s); } #endif #endif } else { return dispatch_queued(s); } if (s->protocol == LO_TCP) { data = lo_server_recv_raw_stream(s, &size); } else { data = lo_server_recv_raw(s, &size); } if (!data) { return 0; } if (lo_server_dispatch_data(s, data, size) < 0) { free(data); return -1; } free(data); return size; }