2014-04-26 3 views
1

Comment la socket ZeroMQ ROUTER gère-t-elle ses connexions client en interne?Maintenance du client dans ZMQ ROUTER

Le guide dit chaque client reçoit un identifiant unique, mais il est pas clair sur:

  1. Ce qui compte en tant que client (chaque machine un autre client ou chaque application connectée différents ??)
  2. Y a-t-il une limite au nombre de demandes reçues d'un client?

La raison en est, je suis contrainte de tester ce code (de http://hintjens.com/blog:42) avec ab:

#include "czmq.h" 

int main(void) 
{ 
    zctx_t *ctx = zctx_new(); 
    void *router = zsocket_new(ctx, ZMQ_ROUTER); 
    zsocket_set_router_raw(router, 1); 
    zsocket_set_sndhwm(router, 0); 
    zsocket_set_rcvhwm(router, 0); 
    int rc = zsocket_bind(router, "tcp://*:8080"); 
    assert(rc != -1); 

    while (true) 
    { 
     // Get HTTP request 
     zframe_t *handle = zframe_recv(router); 
     if (!handle) break;   // Ctrl-C interrupt 
     char *request = zstr_recv(router); 
     puts(request);  // Professional Logging(TM) 
     free(request);  // We throw this away 

     // Send Hello World response 
     zframe_send(&handle, router, ZFRAME_MORE + ZFRAME_REUSE); 
     zstr_send(router, "HTTP/1.0 200 OK\r\n""Content-Type: text/plain\r\n""\r\n""Hello, World!"); 

     // Close connection to browser 
     zframe_send(&handle, router, ZFRAME_MORE); 
     zmq_send(router, NULL, 0, 0); 
    } 
    zctx_destroy(&ctx); 
    return 0; 
} 

Administré la commande ab -n 1000 -c 10 http://192.168.74.1:8080/ il complète parfois bien, mais plusieurs fois il se bloque juste pendant un certain temps et puis se termine bien ou échoue avec apr_pollset_poll: The timeout specified has expired (70007) après un certain nombre aléatoire de messages (disons, 300, 700 etc.)

La partie intéressante est, tandis que ab est suspendu (peut-être attendre une réponse), si vous ouvrez une connexion différente de machine différente/navigateur, ça marche bien. Comment une nouvelle connexion à partir d'un navigateur différent réussit-elle, alors que ab ne fait que traîner? Donc, je me demande si c'est une 'limite de connexion' par ROUTEUR ou autre chose qui se passe. Notez que le HWM est défini sur 0.

Répondre

0

J'ai également effectué une analyse comparative avec la version python du même code que celle indiquée ici. [https://gist.github.com/malexer/8664997]. Et cela fonctionne bien, j'ai même testé avec 100000 demandes et son amende aussi. Peut-être pourriez-vous y jeter un coup d'œil. Si vous trouvez la réponse à votre question, vous pouvez nous en informer aussi.

la réponse à vos premières questions est que chaque application connectée compte pour un client et possède un identifiant unique. J'ai conçu un serveur de discussion où plusieurs clients se connectent au routeur Socket - chacun avec un ID unique.