ZeroMQ學習 (四)請求-應答模式

6 請求-應答模式

​ 請求-應答模式,REQ-REP必須同步的進行,即,REQ套接字必須先發送請求,然後等待應答;REP必須先接受請求,然後發送應答。一旦打亂這個順序,將造成錯誤,套接字將無法繼續工作。

請求端源碼request.cpp:


#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main (void)
{
    void *context = zmq_ctx_new();
    void *requster = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requster, "tcp://127.0.0.1:5555");
    int ret;
    while (1)
    {
        zmq_send (requster, "hello", 5, 0);

        sleep (1);

        char buf[256];
        ret = zmq_recv (requster, buf, sizeof(buf) - 1, 0);
        buf[ret] = '\0';
        printf ("recv msg %s\n", buf);

    }
    //  程序不會運行到這裏,以下只是演示我們應該如何結束
    zmq_close (requster);
    zmq_ctx_destroy(context);
    return 0;
}

編譯命令:

g++ request.cpp -lzmq -o request

應答端源碼response.cpp:

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main (void)
{
    void *context = zmq_ctx_new();

    //  與客戶端通信的套接字
    void *responder = zmq_socket (context, ZMQ_REP);
    zmq_bind (responder, "tcp://*:5555");
    int ret;
    while (1)
    {
        //  等待客戶端請求
        char buf[256];
        /*返回值代表讀到的字節個數,失敗返回-1並且設置errno*/
        ret = zmq_recv (responder, buf, sizeof(buf) - 1, 0);
        buf[ret] = '\0';
        printf ("recv msg %s\n", buf);


        sleep (1);

        //  返回應答
        memcpy (buf, "World", 5);
        zmq_send (responder, buf, 5,  0);
    }
    //  程序不會運行到這裏,以下只是演示我們應該如何結束
    zmq_close (responder);
    zmq_ctx_destroy(context);
    return 0;
}
g++ response.cpp -lzmq -o response

​ 1. 可以看到,服務器與客戶端依次打印,並且多開客戶端的時候,服務器也能夠通過一個zmq的套接字正常處理多個客戶端的請求。

​ 2. 服務器沒有啓動的時候,啓動客戶端也不會出錯,ZMQ會自動幫你重新連接。

​ 3. 原生套接字的常見問題,例如socket關閉後讀寫的問題,ZMQ都已經封裝到API中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章