Пример #1
0
int main ()
{
    srand ((unsigned) time (NULL));

    zmq::context_t context(1);
    zmq::socket_t server(context, ZMQ_REP);
    server.bind("tcp://*:5555");

    int cycles = 0;
    while (1) {
        std::string request = s_recv (server);
        cycles++;

        // Simulate various problems, after a few cycles
        if (cycles > 3 && within (3) == 0) {
            std::cout << "I: simulating a crash" << std::endl;
            break;
        }
        else
        if (cycles > 3 && within (3) == 0) {
            std::cout << "I: simulating CPU overload" << std::endl;
            s_sleep (2000);
        }
        std::cout << "I: normal request (" << request << ")" << std::endl;
        s_sleep (1000); // Do some heavy work
        s_send (server, request);
    }
    return 0;
}
Пример #2
0
int main()
{
	// Socket to receive messages on
	void *context = zmq_ctx_new();
	void *receiver = zmq_socket(context, ZMQ_PULL);
	zmq_connect(receiver, "tcp://localhost:5557");

	// Socket to send messages to
	void *sender = zmq_socket(context, ZMQ_PUSH);
	zmq_connect(sender, "tcp://localhost:5558");

	// Process tasks forever
	while (1)
	{
		char *string = s_recv(receiver);
		printf("%s.", string);  // Show progress
		fflush(stdout);
		s_sleep(atoi(string));  // Do the work
		free(string);
		s_send(sender, "");     // Send results to sink
	}

	zmq_close(receiver);
	zmq_close(sender);
	zmq_ctx_destroy(context);
	return 0;
}
Пример #3
0
int main (void)
{
    void *context = zmq_ctx_new ();
    void *worker = zmq_socket (context, ZMQ_DEALER);
    s_set_id (worker);          //  Set a printable identity
    zmq_connect (worker, "tcp://localhost:5671");

    int total = 0;
    while (1) {
        //  Tell the broker we're ready for work
        s_sendmore (worker, "");
        s_send (worker, "Hi Boss");

        //  Get workload from broker, until finished
        // free (s_recv (worker));     //  Envelope delimiter
        // char *workload = s_recv (worker);
        // int finished = (strcmp (workload, "Fired!") == 0);
        // free (workload);
        // if (finished) {
            // printf ("Completed: %d tasks\n", total);
            // break;
        // }
        total++;

        //  Do some random work
        s_sleep (randof (500) + 1);
    }
    zmq_close (worker);
    zmq_ctx_destroy (context);
    return 0;
}
Пример #4
0
int main(){

    void* context = zmq_init(1);

    // socket to receive msgs on: the vent
    void* receiver = zmq_socket(context, ZMQ_PULL);
    zmq_connect( receiver, "tcp://localhost:5557");

    // socket to send msgs to: the sink
    void *sender = zmq_socket( context, ZMQ_PUSH);
    zmq_connect( sender, "tcp://localhost:5558");

    int tasks_received = 0;
    //process
    while(1) {
        char* string = s_recv(receiver);

        fflush(stdout);
        printf("%s.", string);

        //do work
        s_sleep(atoi(string));
        free(string);

        //send results to sink
        s_send(sender, "");
        tasks_received++;
    printf("Task %d got %d tasks\n", getpid(), tasks_received);
    }

    zmq_close(receiver);
    zmq_close(sender);
    zmq_term(0);
    return 0;
}
 bool ServerZMQ::_onUpdate()
 {
     if (s_interrupted)
     {
         return false;
     } 
     
     int result;
     const TString& subscriberId = this->getSubscribeId();
     result = s_sendmore(m_socket, subscriberId.c_str());
     if (result == -1)
     {
         DMSG_LOGGER("Error occurred during send subscribe id");
         return false;
     }
     
     const TString& message = getMessageString();
     //TString msg = message;
     //std::replace(msg.begin(), msg.end(), '{', ')');
     //DMSG_LOGGER(message.c_str());
     
     result = s_send(m_socket, message.c_str());
     if (result == -1)
     {
         zmqlog("Error occurred during send message ");
         DMSG_LOGGER("Error sending %s ", message.c_str());
         return false;
     }
     
     //sleep for 1 to 2 seconds
     int sleeptime = (rand() % 1000) + 1000;
     s_sleep(sleeptime);
     
     return true;
 }
Пример #6
0
static void *
worker_thread (void *arg) {

    zmq::context_t * context = (zmq::context_t *)arg;
    zmq::socket_t worker (*context, ZMQ_REQ);
    
    //  We use a string identity for ease here
    s_set_id (worker);
    worker.connect("ipc://routing.ipc");

    int total = 0;
    while (1) {
        //  Tell the router we're ready for work
        s_send (worker, "ready");

        //  Get workload from router, until finished
        std::string workload = s_recv (worker);
        int finished = (workload.compare("END") == 0);
        
        if (finished) {
            std::cout << "Processed: " << total << " tasks" << std::endl;
            break;
        }
        total++;

        //  Do some random work
        s_sleep(within (100) + 1);
    }
    return (NULL);
}
Пример #7
0
static void *
worker_task(void *args) {
    void *context = zmq_init(1);
    void *worker = zmq_socket(context, ZMQ_REQ);

    // s_set_id()函数会根据套接字生成一个可打印的字符串,
    // 并以此作为该套接字的标识。
    s_set_id(worker);
    zmq_connect(worker, "ipc://routing.ipc");

    int total = 0;
    while (1) {
        // 告诉ROUTER我已经准备好了
        s_send(worker, "ready");

        // 从ROUTER中获取工作,直到收到结束的信息
        char *workload = s_recv(worker);
        int finished = (strcmp(workload, "END") == 0);
        free(workload);
        if (finished) {
            printf("Processed: %d tasks\n", total);
            break;
        }
        total++;

        // 随机等待一段时间
        s_sleep(randof(1000) + 1);
    }
    zmq_close(worker);
    zmq_term(context);
    return NULL;
}
Пример #8
0
zmsg_t *
mdwrk_recv (mdwrk_t *self, zmsg_t *reply)
{
    //  Format and send the reply if we were provided one
    assert (reply || !self->expect_reply);
    if (reply) {
        zmsg_t *msg = zmsg_dup (reply);
        zmsg_push (msg, MDPS_REPLY);
        zmsg_push (msg, MDPS_HEADER);
        zmsg_send (&msg, self->worker);
    }
    self->expect_reply = 1;

    while (1) {
        zmq_pollitem_t items [] = { { self->worker,  0, ZMQ_POLLIN, 0 } };
        zmq_poll (items, 1, HEARTBEAT_INTERVAL * 1000);

        if (items [0].revents & ZMQ_POLLIN) {
            zmsg_t *msg = zmsg_recv (self->worker);
            self->liveness = HEARTBEAT_LIVENESS;

            //  Don't try to handle errors, just assert noisily
            assert (zmsg_parts (msg) >= 3);

            char *header = zmsg_pop (msg);
            assert (strcmp (header, MDPS_HEADER) == 0);
            free (header);

            char *command = zmsg_pop (msg);
            if (strcmp (command, MDPS_REQUEST) == 0)
                return msg;     //  We have a request to process
            else
            if (strcmp (command, MDPS_HEARTBEAT) == 0)
                ;               //  Do nothing for heartbeats
            else
            if (strcmp (command, MDPS_DISCONNECT) == 0)
                break;          //  Return empty handed
            else {
                printf ("E: invalid input message (%d)\n", (int) command [1]);
                zmsg_dump (msg);
            }
            free (command);
        }
        else
        if (--self->liveness == 0) {
            s_sleep (RECONNECT_INTERVAL);
            s_connect_to_broker (self);
        }
        //  Send HEARTBEAT if it's time
        if (s_clock () > self->heartbeat_at) {
            self->heartbeat_at = s_clock () + HEARTBEAT_INTERVAL;
            s_send (self->worker, "HEARTBEAT");
        }
    }
    //  We exit if we've been disconnected
    return NULL;
}
Пример #9
0
void
flcliapi_connect (flcliapi_t *self, char *endpoint)
{
    assert (self);
    assert (endpoint);
    zmsg_t *msg = zmsg_new (endpoint);
    zmsg_push (msg, "CONNECT");
    zmsg_send (&msg, self->control);
    s_sleep (100);      //  Allow connection to come up
}
Пример #10
0
int main (int argc, char *argv[])
{
    zmq::context_t context(1);
    
    //  Socket to receive messages on
    zmq::socket_t receiver(context, ZMQ_PULL);
    receiver.connect("tcp://localhost:5557");

    //  Socket to send messages to
    zmq::socket_t sender(context, ZMQ_PUSH);
    sender.connect("tcp://localhost:5558");

    //  Socket for control input
    zmq::socket_t controller (context, ZMQ_SUB);
    controller.connect("tcp://localhost:5559");
   	controller.setsockopt(ZMQ_SUBSCRIBE, "", 0);

    //  Process messages from receiver and controller
    zmq::pollitem_t items [] = {
        { receiver, 0, ZMQ_POLLIN, 0 },
        { controller, 0, ZMQ_POLLIN, 0 }
    };
    //  Process messages from both sockets
    while (1) {
        zmq::message_t message;
        zmq::poll (&items [0], 2, -1);
        
        if (items [0].revents & ZMQ_POLLIN) {
			receiver.recv(&message);

            //  Process task
            int workload;           //  Workload in msecs
            
            std::istringstream iss(static_cast<char*>(message.data()));
            iss >> workload;

            //  Do the work
            s_sleep(workload);

            //  Send results to sink
            message.rebuild();
            sender.send(message);

            //  Simple progress indicator for the viewer
            std::cout << "." << std::flush;

        }
        //  Any waiting controller command acts as 'KILL'
        if (items [1].revents & ZMQ_POLLIN)
        {
        	std::cout << std::endl;
            break;                      //  Exit loop
    	}
    }
Пример #11
0
int main (void) 
{
    void *context = zmq_ctx_new ();

    //  Socket to receive messages on
    void *receiver = zmq_socket (context, ZMQ_PULL);
    zmq_connect (receiver, "tcp://localhost:5557");

    //  Socket to send messages to
    void *sender = zmq_socket (context, ZMQ_PUSH);
    zmq_connect (sender, "tcp://localhost:5558");

    //  Socket for control input
    void *controller = zmq_socket (context, ZMQ_SUB);
    zmq_connect (controller, "tcp://localhost:5559");
    zmq_setsockopt (controller, ZMQ_SUBSCRIBE, "", 0);

    //  Process messages from receiver and controller
    zmq_pollitem_t items [] = {
        { receiver, 0, ZMQ_POLLIN, 0 },
        { controller, 0, ZMQ_POLLIN, 0 }
    };
    //  Process messages from both sockets
    while (true) {
        zmq_msg_t message;
        zmq_poll (items, 2, -1);
        if (items [0].revents & ZMQ_POLLIN) {
            zmq_msg_init (&message);
            zmq_msg_recv (&message, receiver, 0);

            //  Do the work
            s_sleep (atoi ((char *) zmq_msg_data (&message)));

            //  Send results to sink
            zmq_msg_init (&message);
            zmq_msg_send (&message, sender, 0);

            //  Simple progress indicator for the viewer
            printf (".");
            fflush (stdout);

            zmq_msg_close (&message);
        }
        //  Any waiting controller command acts as 'KILL'
        if (items [1].revents & ZMQ_POLLIN)
            break;                      //  Exit loop
    }
    //  Finished
    zmq_close (receiver);
    zmq_close (sender);
    zmq_close (controller);
    zmq_ctx_destroy (context);
    return 0;
}
Пример #12
0
int main (int argc, char *argv [])
{
    int verbose = (argc > 1 && streq (argv [1], "-v"));
    mdcli_t *session = mdcli_new ("tcp://localhost:5555", verbose);

    //  1. Send 'echo' request to Titanic
    zmsg_t *request = zmsg_new ("Hello world");
    zmsg_push (request, "echo");
    zmsg_t *reply = s_service_call (
        session, "titanic.request", &request);
    char *uuid = NULL;
    if (reply) {
        uuid = zmsg_pop (reply);
        zmsg_destroy (&reply);
        printf ("I: request UUID: %s\n", uuid);
    }

    //  2. Wait until we get a reply
    while (!s_interrupted) {
        s_sleep (100);
        request = zmsg_new (uuid);
        zmsg_t *reply = s_service_call (
            session, "titanic.reply", &request);
        if (reply) {
            printf ("Reply: %s\n", zmsg_body (reply));
            zmsg_destroy (&reply);

            //  3. Close request
            request = zmsg_new (uuid);
            reply = s_service_call (session, "titanic.close", &request);
            zmsg_destroy (&reply);
            break;
        }
        else {
            printf ("I: no reply yet, trying again...\n");
            s_sleep (5000);     //  Try again in 5 seconds
        }
    }
    mdcli_destroy (&session);
    return 0;
}
Пример #13
0
int main (void)
{
	// prepare our context and sockets
	void *context = zmq_init (1);

	// Connect to task ventilator
	void *receiver = zmq_socket (context, ZMQ_PULL);
	zmq_connect (receiver, "tcp://localhost:5557");

	// Connect to weather server
	void *subscriber = zmq_socket (context, ZMQ_SUB);
	zmq_connect (subscriber, "tcp://localhost:5556");
	zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "10001 ", 6);

	// Process messages from both sockets
	// We priortize traffic from the task ventilator
	while (1)
	{
		// Process any waitting tasks
		int rc;
		for (rc = 0; rc == 0; )
		{
			zmq_msg_t task;
			zmq_msg_init (&task);
			if ((rc = zmq_recv (receiver, &task, ZMQ_NOBLOCK)) == 0)
			{
				// process task
				printf ("Task received\n");
			}
			zmq_msg_close (&task);
		}
		// Process any waitting weather updates
		for (rc = 0; rc == 0;)
		{
			zmq_msg_t update;
			zmq_msg_init (&update);
			if ((rc = zmq_recv (subscriber, &update, ZMQ_NOBLOCK)) == 0)
			{
				// process weather update
				printf ("Weather update received\n");
			}
			zmq_msg_close (&update);
		}
		// No activity, so sleep for 1 msec
		s_sleep (1);
	}

	// We never get here but clean up anyhow
	zmq_close (receiver);
	zmq_close (subscriber);
	zmq_term (context);
	return 0;
}
Пример #14
0
int main(void)
{

    pthread_t frontend,backend,switchend;
    void *context = zmq_ctx_new();
    routine_arg_t arg;
    arg.context = context;
    arg.switch_port = 9999;
    arg.direct_port = 10000;
    arg.device_port = 9000;

    s_sleep(100);

    pthread_create(&frontend, NULL, direct_routine, &arg);
    s_sleep(1000);
    pthread_create(&switchend, NULL, switch_routine, &arg);
    s_sleep(1000);
    pthread_create(&backend, NULL, device_routine, &arg);

    s_sleep(1000000);

    //我喜欢简单粗暴.. 所有没有关闭线程就退出了:)
    return 0;
}
Пример #15
0
int main22 () {

    zmq::context_t context(1);

    zmq::socket_t client (context, ZMQ_ROUTER);
    client.bind("tcp://*:5555");

    pthread_t worker;
    pthread_create (&worker, NULL, worker_a, &context);
    pthread_create (&worker, NULL, worker_b, &context);

    //  Wait for threads to stabilize
    s_sleep (1000);

    //  Send 10 tasks scattered to A twice as often as B
    int task_nbr;
    srand ((unsigned) time (NULL));
    for (task_nbr = 0; task_nbr < 100; task_nbr++) {
        //  Send two message parts, first the address...
        if (within (3) > 0)
            s_sendmore (client, "A");
        else
            s_sendmore (client, "B");

        //  And then the workload
        s_send (client, "This is the workload");
    }
    s_sendmore (client, "A");
    s_send     (client, "END");

    s_sendmore (client, "B");
    s_send     (client, "END");

    s_sleep (1000);              //  Give 0MQ/2.0.x time to flush output
    return 0;
}
Пример #16
0
int main (void) 
{
    //  Prepare our context and sockets
    void *context = zmq_ctx_new ();

    //  Connect to task ventilator
    void *receiver = zmq_socket (context, ZMQ_PULL);
    zmq_connect (receiver, "tcp://localhost:5557");

    //  Connect to weather server
    void *subscriber = zmq_socket (context, ZMQ_SUB);
    zmq_connect (subscriber, "tcp://localhost:5556");
    zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "10001 ", 6);

    //  Process messages from both sockets
    //  We prioritize traffic from the task ventilator
    while (1) {
        //  Process any waiting tasks
        int rc;
        for (rc = 0; !rc; ) {
            zmq_msg_t task;
            zmq_msg_init (&task);
            if ((rc = zmq_msg_recv (&task, receiver, ZMQ_DONTWAIT)) != -1) {
                //  process task
            }
            zmq_msg_close (&task);
        }
        //  Process any waiting weather updates
        for (rc = 0; !rc; ) {
            zmq_msg_t update;
            zmq_msg_init (&update);
            if ((rc = zmq_msg_recv (&update, subscriber, ZMQ_DONTWAIT)) != -1) {
                //  process weather update
            }
            zmq_msg_close (&update);
        }
        //  No activity, so sleep for 1 msec
        s_sleep (1);
    }
    //  We never get here but clean up anyhow
    zmq_close (receiver);
    zmq_close (subscriber);
    zmq_ctx_destroy (context);
    return 0;
}
Пример #17
0
	virtual void workFunc()
	{
		// Socket to talk to dispatcher
		void *receiver = zmq_socket(context_, ZMQ_REP);
		zmq_connect(receiver, "inproc://workers");

		while (1)
		{
			char *string = s_recv(receiver);
			printf("#%d Received request: [%s]\n", no_, string);
			free(string);

			s_sleep(1);

			s_send(receiver, "World");
		}

		zmq_close(receiver);
	}
Пример #18
0
int main21 () {
    zmq::context_t context(1);
    zmq::socket_t client (context, ZMQ_ROUTER);
    client.bind("tcp://*:5555");

    int worker_nbr;
    for (worker_nbr = 0; worker_nbr < NBR_WORKERS; worker_nbr++) {
        pthread_t worker;
        pthread_create (&worker, NULL, worker_thread, &context);
    }
    int task_nbr;
    for (task_nbr = 0; task_nbr < NBR_WORKERS * 4; task_nbr++) {
        //  LRU worker is next waiting in queue
        std::string address = s_recv (client);
        {
            // receiving and discarding'empty' message
            s_recv (client);
            // receiving and discarding 'ready' message
            s_recv (client);
        }

        s_sendmore (client, address);
        s_sendmore (client, "");
        s_send (client, "This is the workload");
    }
    //  Now ask mamas to shut down and report their results
    for (worker_nbr = 0; worker_nbr < NBR_WORKERS; worker_nbr++) {
        std::string address = s_recv (client);
        {
            // receiving and discarding'empty' message
            s_recv (client);
            // receiving and discarding 'ready' message
            s_recv (client);
        }

        s_sendmore (client, address);
        s_sendmore (client, "");
        s_send (client, "END");
    }
    s_sleep (1000);              //  Give 0MQ/2.0.x time to flush output
    return 0;
}
Пример #19
0
int main5 (int argc, char *argv[])
{
    zmq::context_t context (1);

    //  Socket to send messages on
    zmq::socket_t  sender(context, ZMQ_PUSH);
    sender.bind("tcp://*:5557");

    std::cout << "Press Enter when the workers are ready: " << std::endl;
    getchar ();
    std::cout << "Sending tasks to workers...\n" << std::endl;

    //  The first message is "0" and signals start of batch
    zmq::socket_t sink(context, ZMQ_PUSH);
    sink.connect("tcp://localhost:5558");
    zmq::message_t message(2);
    memcpy(message.data(), "0", 1);
    sink.send(message);

    //  Initialize random number generator
    srand ((unsigned) time (NULL));

    //  Send 100 tasks
    int task_nbr;
    int total_msec = 0;     //  Total expected cost in msecs
    for (task_nbr = 0; task_nbr < 100; task_nbr++) {
        int workload;
        //  Random workload from 1 to 100msecs
        workload = within (100) + 1;
        total_msec += workload;

		message.rebuild(10);
		sprintf ((char *) message.data(), "%d", workload);
		sender.send(message);
    }
    std::cout << "Total expected cost: " << total_msec << " msec" << std::endl;
    s_sleep (1);              //  Give 0MQ time to deliver

    return 0;
}
Пример #20
0
int32_t Worker::RequestHandler::handleRequest(const SplitInfo &request,
                                              base::ProducerConsumerQueue<base::Block<SplitInfo> >* queue) {
    LOG(INFO) << "fetching split " << request.filename <<
                 " start: " << request.start <<
                 " end: " << request.end <<
                 " schema: " << request.schema <<
                 " objectType: " << request.objectType;

#if 0
    const uint64_t sleepTimeMs = 1000;
    const uint64_t kNumProgressUpdates = 1;
    uint64_t bytesPerUpdate = (request.end - request.start) / kNumProgressUpdates;
    /**
     * Send status updates
     */
    for(int i = 0; i < kNumProgressUpdates; i++) {
        s_sleep(within(sleepTimeMs/kNumProgressUpdates));
        base::Block<SplitInfo>* block;
        queue->getWriteSlot(&block);
        block->data.type = SplitInfo::PROGRESS_UPDATE;
        block->data.bytesCompleted = request.start +
                ((i + 1) * bytesPerUpdate);
        block->data.bytesTotal = request.end;
        block->data.filename = request.filename;
        queue->slotWritten(block);
    }
    //s_sleep(within(sleepTimeMs));
#else
    base::ConfigurationMap conf;
    conf["schemaUrl"] = request.schema;
    conf["chunkStart"] = request.start;
    conf["chunkEnd"] = request.end;
    ddc_read(request.filename,
             request.objectType,
             conf);
    return 0;
#endif

    return 0; //status code
}
Пример #21
0
int main (int argc, char *argv[])
{
    zmq::context_t context(1);

    //  Socket to receive messages on
    zmq::socket_t receiver(context, ZMQ_PULL);
    receiver.connect("tcp://localhost:5557");

    //  Socket to send messages to
    zmq::socket_t sender(context, ZMQ_PUSH);
    sender.connect("tcp://localhost:5558");

    //  Process tasks forever
    while (1) {

        zmq::message_t message;
        int workload;           //  Workload in msecs

        receiver.recv(&message);
        std::string smessage(static_cast<char*>(message.data()), message.size());

        std::istringstream iss(smessage);
        iss >> workload;

        //  Do the work
        s_sleep(workload);

        //  Send results to sink
        message.rebuild();
        sender.send(message);

        //  Simple progress indicator for the viewer
		std::cout << "." << std::flush;
    }
    return 0;
}
Пример #22
0
int main () {
	zmq::context_t context(1);

    //  Socket to talk to clients
    zmq::socket_t publisher (context, ZMQ_PUB);
    publisher.bind("tcp://*:5561");

    //  Socket to receive signals
    zmq::socket_t syncservice (context, ZMQ_REP);
    syncservice.bind("tcp://*:5562");

    //  Get synchronization from subscribers
    int subscribers = 0;
    while (subscribers < SUBSCRIBERS_EXPECTED) {
        
		//  - wait for synchronization request
		s_recv (syncservice);
       
		//  - send synchronization reply
		s_send (syncservice, "");


        subscribers++;
    }
    
    //  Now broadcast exactly 1M updates followed by END
    int update_nbr;
    for (update_nbr = 0; update_nbr < 1000000; update_nbr++) {	
		s_send (publisher, "Rhubarb");
	}
	
    s_send (publisher, "END");

    s_sleep (1000);              //  Give 0MQ time to flush output
    return 0;
}
Пример #23
0
static void *
worker_task(void *args)
{
    zmq::context_t context(1);
    zmq::socket_t worker(context, ZMQ_DEALER);

#if (defined (WIN32))
    s_set_id(worker, (intptr_t)args);
#else
    s_set_id(worker);          //  Set a printable identity
#endif

    worker.connect("tcp://localhost:5671");

    int total = 0;
    while (1) {
        //  Tell the broker we're ready for work
        s_sendmore(worker, "");
        s_send(worker, "Hi Boss");

        //  Get workload from broker, until finished
        s_recv(worker);     //  Envelope delimiter
        std::string workload = s_recv(worker);
        //  .skip
        if ("Fired!" == workload) {
            std::cout << "Completed: " << total << " tasks" << std::endl;
            break;
        }
        total++;

        //  Do some random work
        s_sleep(within(500) + 1);
    }

    return NULL;
}
Пример #24
0
int main (void)
{
    s_version_assert (2, 1);
    srandom ((unsigned) time (NULL));

    void *context = zmq_init (1);
    void *worker = s_worker_socket (context);

    //  If liveness hits zero, queue is considered disconnected
    size_t liveness = HEARTBEAT_LIVENESS;
    size_t interval = INTERVAL_INIT;

    //  Send out heartbeats at regular intervals
    uint64_t heartbeat_at = s_clock () + HEARTBEAT_INTERVAL;

    int cycles = 0;
    while (1) {
        zmq_pollitem_t items [] = { { worker,  0, ZMQ_POLLIN, 0 } };
        zmq_poll (items, 1, HEARTBEAT_INTERVAL * 1000);

        if (items [0].revents & ZMQ_POLLIN) {
            //  Get message
            //  - 3-part envelope + content -> request
            //  - 1-part "HEARTBEAT" -> heartbeat
            zmsg_t *msg = zmsg_recv (worker);

            if (msg_parts (msg) == 3) {
                //  Simulate various problems, after a few cycles
                cycles++;
                if (cycles > 3 && randof (5) == 0) {
                    printf ("I: (%s) simulating a crash\n", identity);
                    zmsg_destroy (&msg);
                    break;
                }
                else
                if (cycles > 3 && randof (5) == 0) {
                    printf ("I: (%s) simulating CPU overload\n", identity);
                    sleep (5);
                }
                printf ("I: (%s) normal reply - %s\n",
                    identity, zmsg_body (msg));
                zmsg_send (&msg, worker);
                liveness = HEARTBEAT_LIVENESS;
                sleep (1);              //  Do some heavy work
            }
            else
            if (msg_parts (msg) == 1
            && strcmp (msg_body (msg), "HEARTBEAT") == 0)
                liveness = HEARTBEAT_LIVENESS;
            else {
                printf ("E: (%s) invalid message\n", identity);
                zmsg_dump (msg);
            }
            interval = INTERVAL_INIT;
        }
        else
        if (--liveness == 0) {
            printf ("W: (%s) heartbeat failure, can't reach queue\n",
                identity);
            printf ("W: (%s) reconnecting in %zd msec...\n",
                identity, interval);
            s_sleep (interval);

            if (interval < INTERVAL_MAX)
                interval *= 2;
            zmq_close (worker);
            worker = s_worker_socket (context);
            liveness = HEARTBEAT_LIVENESS;
        }

        //  Send heartbeat to queue if it's time
        if (s_clock () > heartbeat_at) {
            heartbeat_at = s_clock () + HEARTBEAT_INTERVAL;
            printf ("I: (%s) worker heartbeat\n", identity);
            s_send (worker, "HEARTBEAT");
        }
    }
    zmq_close (worker);
    zmq_term (context);
    return 0;
}
Пример #25
0
int main (void)
{
    s_version_assert (2, 1);
    srand ((unsigned) time (NULL));

    zmq::context_t context (1);
    zmq::socket_t * worker = s_worker_socket (context);

    //  If liveness hits zero, queue is considered disconnected
    size_t liveness = HEARTBEAT_LIVENESS;
    size_t interval = INTERVAL_INIT;

    //  Send out heartbeats at regular intervals
    int64_t heartbeat_at = s_clock () + HEARTBEAT_INTERVAL;

    int cycles = 0;
    while (1) {
        zmq::pollitem_t items [] = { { *worker,  0, ZMQ_POLLIN, 0 } };
        zmq::poll (items, 1, HEARTBEAT_INTERVAL * 1000);

        if (items [0].revents & ZMQ_POLLIN) {
            //  Get message
            //  - 3-part envelope + content -> request
            //  - 1-part "HEARTBEAT" -> heartbeat
            zmsg msg (*worker);

            if (msg.parts () == 3) {
                //  Simulate various problems, after a few cycles
                cycles++;
                if (cycles > 3 && within (5) == 0) {
                    std::cout << "I: (" << identity << ") simulating a crash" << std::endl;
                    msg.clear ();
                    break;
                }
                else {
                   if (cycles > 3 && within (5) == 0) {
                      std::cout << "I: (" << identity << ") simulating CPU overload" << std::endl;
                       s_sleep (5000);
                   }
                }
                std::cout << "I: (" << identity << ") normal reply - " << msg.body() << std::endl;
                msg.send (*worker);
                liveness = HEARTBEAT_LIVENESS;
                s_sleep (1000);              //  Do some heavy work
            }
            else {
               if (msg.parts () == 1
               && strcmp (msg.body (), "HEARTBEAT") == 0) {
                   liveness = HEARTBEAT_LIVENESS;
               }
               else {
                   std::cout << "E: (" << identity << ") invalid message" << std::endl;
                   msg.dump ();
               }
            }
            interval = INTERVAL_INIT;
        }
        else
        if (--liveness == 0) {
            std::cout << "W: (" << identity << ") heartbeat failure, can't reach queue" << std::endl;
            std::cout << "W: (" << identity << ") reconnecting in " << interval << " msec..." << std::endl;
            s_sleep (interval);

            if (interval < INTERVAL_MAX) {
                interval *= 2;
            }
            delete worker;
            worker = s_worker_socket (context);
            liveness = HEARTBEAT_LIVENESS;
        }

        //  Send heartbeat to queue if it's time
        if (s_clock () > heartbeat_at) {
            heartbeat_at = s_clock () + HEARTBEAT_INTERVAL;
            std::cout << "I: (" << identity << ") worker heartbeat" << std::endl;
            s_send (*worker, "HEARTBEAT");
        }
    }
    delete worker;
    return 0;
}
Пример #26
0
void cast_spell(int spell)
{
    switch(spell) {
    case S_MON_DET:
        s_mondet();
        break;
    case S_OBJ_DET:
        s_objdet();
        break;
    case S_IDENTIFY:
        s_identify();
        break;
    case S_FIREBOLT:
        s_firebolt();
        break;
    case S_SLEEP:
        s_sleep();
        break;
    case S_LBALL:
        s_lball();
        break;
    case S_TELEPORT:
        s_teleport();
        break;
    case S_DISRUPT:
        s_disrupt();
        break;
    case S_DISINTEGRATE:
        s_disintegrate();
        break;
    case S_MISSILE:
        s_missile();
        break;
    case S_HEAL:
        s_heal();
        break;
    case S_DISPEL:
        s_dispel();
        break;
    case S_BREATHE:
        s_breathe();
        break;
    case S_INVISIBLE:
        s_invisible();
        break;
    case S_WARP:
        s_warp();
        break;
    case S_ENCHANT:
        s_enchant();
        break;
    case S_BLESS:
        s_bless();
        break;
    case S_RESTORE:
        s_restore();
        break;
    case S_CURE:
        s_cure();
        break;
    case S_TRUESIGHT:
        s_truesight();
        break;
    case S_HELLFIRE:
        s_hellfire();
        break;
    case S_KNOWLEDGE:
        s_knowledge();
        break;
    case S_HERO:
        s_hero();
        break;
    case S_RETURN:
        s_return();
        break;
    case S_DESECRATE:
        s_desecrate();
        break;
    case S_HASTE:
        s_haste();
        break;
    case S_SUMMON:
        s_summon();
        break;
    case S_SANCTUARY:
        s_sanctuary();
        break;
    case S_ACCURACY:
        s_accuracy();
        break;
    case S_RITUAL:
        s_ritual();
        break;
    case S_APPORT:
        s_apport();
        break;
    case S_SHADOWFORM:
        s_shadowform();
        break;
    case S_ALERT:
        s_alert();
        break;
    case S_REGENERATE:
        s_regenerate();
        break;
    case S_SANCTIFY:
        s_sanctify();
        break;
    case S_CLAIRVOYANCE:
        s_clairvoyance();
        break;
    case S_DRAIN:
        s_drain();
        break;
    case S_LEVITATE:
        s_levitate();
        break;
    case S_FEAR:
        s_fear();
        break;
    case S_POLYMORPH:
        s_polymorph();
        break;
    case S_WISH:
        s_wish();
        break;
    case S_NUTRITION:
        s_nutrition();
        break;
    default:
        mprint("Your odd spell fizzles with a small 'sput'.");
        break;
    }
}
Пример #27
0
int main () 
{
	std::cout << "starting server..."<<std::endl;


	fps = 25;
	frameDuration = (int) round(1000.0 / (float) fps);
    
	//  Prepare our context and socket
	zmq::context_t context(1);
	zmq::socket_t socket(context, ZMQ_REP);
	
	try {
		socket.bind ("tcp://*:5555");
	} catch (zmq::error_t error) {
		std::cout << "Error Binding to address" << std::endl;
		std::cout << error.what();
	
		exit(1);
	}
	
	// starting kinect
	if (initKinect()==false) {
		std::cout << "Kinect Init Failed. Quiting..." << std::endl;
		
		exit(2);
	}
	
	
	int bufferSize = 3*640*480;
	char *depth=(char *)malloc(bufferSize);
	memset(depth, 255, bufferSize);
	kinectControl->setDepthMid(depth);
	
    while (true) {
        
        //  Wait for next request from client
		std::string request;
		try {
			request = s_recv(socket);
		}
		catch (zmq::error_t error) {
			std::cout << "Error recieving message." << std::endl;
			std::cout << error.what();
			exit(1);
		}
		
		if (request.compare("getRGB") == 0) {
			try {
				uint8_t *rgb = kinectControl->getRGB();
				zmq::message_t message(bufferSize);
				memcpy(message.data(), rgb, bufferSize);
				socket.send(message);
			}
			catch (zmq::error_t error) {
				std::cout << "Error sending RGB image." << std::endl;
				std::cout << error.what();
				exit(1);				
			}
			/*
			uint8_t *rgb = kinectControl->getRGB();
			s_send(socket, (char *) rgb);
			 */
		}	
		
		if (request.compare("getDepthmap") == 0) {		
			try {
				zmq::message_t message(bufferSize);
				memcpy(message.data(), depth, bufferSize);
				socket.send(message);
			}
			catch (zmq::error_t error) {
				std::cout << "Error sending depth image." << std::endl;
				std::cout << error.what();
				exit(1);
				
			}
			
		}		
		
		//usleep(frameDuration);	
		s_sleep(frameDuration);
    }
	
	socket.close();
	return 0;
}
Пример #28
0
    zmsg *
    recv (zmsg *&reply_p)
    {
        //  Format and send the reply if we were provided one
        zmsg *reply = reply_p;
        assert (reply || !m_expect_reply);
        if (reply) {
            assert (m_reply_to.size()!=0);
            reply->wrap (m_reply_to.c_str(), "");
            m_reply_to = "";
            send_to_broker ((char*)MDPW_REPLY, "", reply);
            delete reply_p;
            reply_p = 0;
        }
        m_expect_reply = true;

        while (!s_interrupted) {
            zmq::pollitem_t items [] = {
                { *m_worker,  0, ZMQ_POLLIN, 0 } };
            zmq::poll (items, 1, m_heartbeat * 1000);

            if (items [0].revents & ZMQ_POLLIN) {
                zmsg *msg = new zmsg(*m_worker);
                if (m_verbose) {
                    s_console ("I: received message from broker:");
                    msg->dump ();
                }
                m_liveness = HEARTBEAT_LIVENESS;

                //  Don't try to handle errors, just assert noisily
                assert (msg->parts () >= 3);

                std::basic_string<unsigned char> empty = msg->pop_front ();
                assert (empty.compare((unsigned char *)"") == 0);
                //assert (strcmp (empty, "") == 0);
                //free (empty);

                std::basic_string<unsigned char> header = msg->pop_front ();
                assert (header.compare((unsigned char *)MDPW_WORKER) == 0);
                //free (header);

                std::string command = (char*) msg->pop_front ().c_str();
                if (command.compare (MDPW_REQUEST) == 0) {
                    //  We should pop and save as many addresses as there are
                    //  up to a null part, but for now, just save one...
                    m_reply_to = msg->unwrap ();
                    return msg;     //  We have a request to process
                }
                else if (command.compare (MDPW_HEARTBEAT) == 0) {
                    //  Do nothing for heartbeats
                }
                else if (command.compare (MDPW_DISCONNECT) == 0) {
                    connect_to_broker ();
                }
                else {
                    s_console ("E: invalid input message (%d)",
                          (int) *(command.c_str()));
                    msg->dump ();
                }
                delete msg;
            }
            else
            if (--m_liveness == 0) {
                if (m_verbose) {
                    s_console ("W: disconnected from broker - retrying...");
                }
                s_sleep (m_reconnect);
                connect_to_broker ();
            }
            //  Send HEARTBEAT if it's time
            if (s_clock () > m_heartbeat_at) {
                send_to_broker ((char*)MDPW_HEARTBEAT, "", NULL);
                m_heartbeat_at = s_clock () + m_heartbeat;
            }
        }
        if (s_interrupted)
            printf ("W: interrupt received, killing worker...\n");
        return NULL;
    }