2016-09-20 4 views
0

Ich habe zwei einfache Programme: ein Client und ein Server. Ich versuche zstr_sendfm und zstr_recv zu verwenden, um eine einfache Zeichenfolge zu senden und zu empfangen. Grob gesagt benutze ich den Code von file transfer test im zeromq Tutorial. Hier ist die Server-Funktion:C ZeroMQ zstr_recv hängt

#define PIPELINE = 10; 

int server() 
{ 
    char *name = "someName"; 
    zctx_t *ctx = zctx_new(); 
    void *router = zsocket_new(ctx, ZMQ_ROUTER); 
    zsocket_set_hwm(router, PIPELINE*2); 
    if (0 == zsocket_connect(router, tcp://127.0.0.1:6000)) 
    { 
     printf("failed to connect to router.\n"); 
    } 
    printf("sending name %s\n, name); 
    zstr_sendfm(router, name); 
    return 0; 
} 

Hier ist die Client-Funktion:

int client() 
{ 
    zctx_t *ctx = zctx_new(); 
    void *dealer = zsocket_new (ctx, ZMQ_DEALER); 
    zsocket_bind(dealer, "tcp://*:6000") 
    char *receivedName = zstr_recv(dealer); 
    printf("received the following name: %s\n", receivedName); 
    return 0 
} 

Beide sind in zwei getrennten Programmen laufen (die nichts anderes tun, anders als ihre jeweiligen Funktionen ausführen) auf demselben Computer.

Hier ist, wie die Dinge immer spielen:

  1. Start-Client-Funktion, die bei „zstr_recv“ hält, wie es
  2. Start-Server-Funktion angenommen hat, die erfolgreich verbindet, behauptet, die Daten gesendet zu haben, und Exits
  3. Client-Funktion weiterhin sitzen und warten, aber behauptet, nichts vom Server erhalten haben.

Was fehlt mir hier? Ich habe eine Reihe von Fehlerüberprüfungen hinzugefügt und dies sogar ohne Erfolg in gdb ausprobiert.

Hilfe und Beratung geschätzt.

Antwort

0

Ich denke, Sie haben Ihren Client und Server durcheinander, obwohl in ZeroMQ Client und Server ist nicht so streng wie bei normalen Sockets. Normalerweise würden Sie einen Server mit einem REP-Socket erstellen, der bindet/empfängt/sendet, und einen Client mit einem REQ-Socket, der verbindet/sendet/empfängt. Sie sollten dies zuerst versuchen und dann mit ROUTER für den Server (anstelle von REP) und DEALER für den Client (anstelle von REQ) experimentieren.