Modelo de publicación y suscripción ZeroMQ_04

En pocas palabras, el servidor publica continuamente mensajes y el cliente los recibirá después de suscribirse.

Aquí nos fijamos en una fortaleza simple:

Servidor:

#include <stdlib.h>  
#include <zmq.h> 
#include < string .h> 
#include <unistd.h> 
#include <time.h> #define buffersize 4096
 #define randof (num) (int) (( float) (num) * random () / (RAND_MAX + 1.0)) int main ( int argc, char * argv []) 
{ // [0] 创建 对象void * ctx = zmq_ctx_new ();
    void * publisher = zmq_socket (ctx, ZMQ_PUB);
    // [1] 绑定 到 5566 端口 
    zmq_bind (editor, " tcp: // *: 5566 "




    
    ); 

     //   初始化 随机 数 生成 器
    srandom ((unsigned) time (NULL));
    while ( 1 ) {
        int código postal, temperatura, relhumidez; 
        código postal      = randof ( 100000 ); 
        temperatura = randof ( 215 ) - 80 ; 
        relhumidity = randof ( 50 ) + 10 ; 

        //   Enviar mensaje a todos los suscriptores 
        char update [ 20 ]; 
        sprintf (actualización, " % 05d% d% d " , código postal, temperatura, relhumidez);
        printf ( " envío del servidor:% s \ n " , actualización);
        // s_send (editor, actualización); 
        zmq_send (editor, actualización, strlen (actualización), 0 ); 
        dormir ( 1 ); 
    } 
    zmq_close (editor); 
    zmq_ctx_destroy (ctx); 
    devuelve  0 ; 
}

Cliente:

#include <stdlib.h>  
#include <zmq.h> 
#include < string .h> 
#include <unistd.h> 
#include <time.h>  
#include <afirmar.h> static char * s_recv ( void * socket ) {
     char buffer [ 256 ];
    int size = zmq_recv (socket, buffer, 255 , 0 );
    if (size == - 1 )
         devuelve NULL; 
    buffer [tamaño] = ' \ 0 ' ; regreso

 

    strndup (buffer, sizeof (buffer) -1 ); 
} 

int main ( int argc, char * argv []) 
{ 
    //   [0] Cree un objeto y conéctese al puerto 5566 
    printf ( " Recopilando actualizaciones del servidor meteorológico ... \ n " );
     void * context = zmq_ctx_new ();
     void * subscriber = zmq_socket (context, ZMQ_SUB);
     int rc = zmq_connect (suscriptor, " tcp: // localhost: 5566 " ); 
    afirmar (rc == 0 ); 

    / / /  [1] Establezca las condiciones del filtro, establezca en vacío, lo que significa suscripción completa, donde "1" significa hacer coincidir los datos que comienzan con "1" 
    const  char * filter =   " 1 " ; 
    rc = zmq_setsockopt (suscriptor, ZMQ_SUBSCRIBE, 
                         filter, strlen (filter )); 
    afirmar (rc == 0 );
     //   [2] aceptar datos 
    int update_nbr;
     long total_temp = 0 ;
     for (update_nbr = 0 ; update_nbr < 100 ; update_nbr ++ ) { 
        
        char * string = s_recv (suscriptor); 
        printf ( "cliente:% s \ n " , cadena );
         int código postal, temperatura, relhumidez; 
        sscanf ( cadena , " % d% d% d " ,
             & código postal, & temperatura, & relhumidity); 
        total_temp + = temperatura;
         libre ( cadena ); 
    } 
    printf ( " La temperatura promedio para el código postal '% s' fue% dF \ n " , 
        filtro, ( int ) (total_temp / update_nbr)); 

    zmq_close (suscriptor); 
    zmq_ctx_destroy (contexto);
    devuelve  0 ; 
}

 

afuera:

// servidor 
enviar servidor: 43345 - 41  19 
servidor enviar: 44203  110  59 
servidor enviar: 78038  2  25 
servidor enviar: 55377  59  18 
servidor enviar: 40135 - 65  36 
servidor enviar: 37950  43  10 

// cliente 
zf @ eappsvr- 0 : ~ / ds / zmq / test / pub_sub> ./ client 
Recopilando actualizaciones del servidor meteorológico ... 
cliente .... 
cliente: 10057  67  11 
cliente:16839  94  25

 

Nota: 

Debe tenerse en cuenta que al usar un socket SUB, debe usar el método zmq_setsockopt () para establecer el contenido de la suscripción. Si no configura el contenido de la suscripción, no recibirá ninguna noticia y es fácil para los novatos cometer este error. La información de suscripción puede ser cualquier cadena y se puede configurar varias veces. Mientras el mensaje satisfaga una de las informaciones de suscripción, se recibirá el socket SUB. El suscriptor puede elegir no recibir ciertos tipos de mensajes, lo que también se logra mediante el método zmq_setsockopt ().

La combinación de socket PUB-SUB es asíncrona. El cliente usa zmq_recv () en un cuerpo de bucle para recibir el mensaje. Si envía un mensaje al socket SUB, se informará un error; de manera similar, el servidor puede usar continuamente zmq_send () para enviar el mensaje, pero no se puede usar en el socket PUB. zmq_recv ().

Una cosa más a tener en cuenta sobre los sockets PUB-SUB: no se puede saber cuándo SUB comenzó a recibir mensajes. Incluso si abre primero el socket SUB y luego abre el PUB para enviar mensajes, entonces SUB perderá algunos mensajes porque lleva algún tiempo establecer una conexión. Muy pocos, pero no cero.

Supongo que te gusta

Origin www.cnblogs.com/vczf/p/12751249.html
Recomendado
Clasificación