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:
- Ce qui compte en tant que client (chaque machine un autre client ou chaque application connectée différents ??)
- 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.