2016-01-21 97 views
0

我想製作一個簡單的服務器。使用TCP發送ZeroMQ數據

我被限制使用的語言是C++。我正在使用ZeroMQ

我已經創建了一個簡單的服務器和客戶端,就像在文檔中一樣。

ZeroMQ使用TCP而不是HTTP

我知道HTTP的底層是TCP,所以我想知道使用TCP而不是HTTP會有什麼性能問題。

而對於HTTP我可以使用curl來測試應用程序。

我應該如何使用TCPcurl命令向帶有字符串參數的套接字發送請求)。


服務器:

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

int main (void) 
{             // Socket to talk to clients 
    void *context = zmq_ctx_new(); 
    void *responder = zmq_socket (context, ZMQ_REP); 
    int rc = zmq_bind (responder, "tcp://*:5555"); 
    assert (rc == 0); 

    while (1) 
    { 
     char buffer [10]; 
     zmq_recv (responder, buffer, 10, 0); 
     printf ("Received Hello\n"); 

                // trying to send json object 
     zmq_send (responder, "World", 5, 0); 
    // zmq_send (responder, "World", 5, 0); 
     sleep (1);         // Do some 'work' 
    } 
    return 0; 
} 

客戶端:

// Hello World client 
// Connects REQ socket to tcp://localhost:5555 
// Sends "Hello" to server, expects "World" back 

#include <zmq.h> 
#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 
int main (void) 
{ 
    void *context = zmq_ctx_new(); 
                // Socket to talk to server 
    printf ("Connecting to hello world server...\n"); 
    void *requester = zmq_socket (context, ZMQ_REQ); 
    zmq_connect (requester, "tcp://localhost:5555"); 
    int request_nbr; 
    for (request_nbr = 0; request_nbr != 10; request_nbr++) 
    { 
     zmq_msg_t request; 
     zmq_msg_init_size (&request, 5); 
     memcpy (zmq_msg_data (&request), "Hello", 5); 
     printf ("Sending Hello %d...\n", request_nbr); 
     zmq_msg_send (&request, requester, 0); 
     zmq_msg_close (&request); 
     zmq_msg_t reply; 

     zmq_msg_init (&reply); 
     zmq_msg_recv (&reply, requester, 0); 
     printf ("Received World %d\n", request_nbr); 
     zmq_msg_close (&reply); 
    } 
    zmq_close (requester); 
    zmq_ctx_destroy (context); 
    return 0; 
} 
+0

從RFC 2616: HTTP通信通常發生在TCP/IP連接上。默認端口是TCP 80,但可以使用其他端口。這並不排除HTTP在Internet上或其他網絡上的任何其他協議之上實施的情況。 HTTP只是假設一個可靠的傳輸;任何提供這種保證的協議都可以使用; HTTP/1.1請求和響應結構到有關協議的傳輸數據單元上的映射超出了本規範的範圍。 – Yogesh

+0

@Yogesh我明白,http是通過tcp構建的。我也理解http的請求響應結構。我的問題是如何使用curl查詢套接字。並使用TCP會造成任何性能開銷? –

+1

使用較低層只能提高性能,而不會使情況變得更糟。 – EJP

回答

0

Q1:將具有由USI任何性能問題ng TCP而不是HTTP
A1:是的,它會的。無論性能和延遲將受益於避免HTTP富,重新包裝數據

Q2:我應該使用TCP發送給一個字符串參數的插座的要求?
A2:沒有命令(curl命令)會幫助你。 ZeroMQ使用特定的行代碼(假設它是通信對等體之間的平凡協議),因此獨立的命令行工具將無法與現成的行代碼要求相匹配。 解決方案?創建一個簡單的c程序,它將使用cmd行參數(作爲示例的字符串)並組裝一個與ZeroMQ層兼容的數據成幀,以便與遠程對等進行通信。你也應該注意到,對於ZeroMQREQ/REP正式溝通模式的工作,這個代理工具將不得不成爲唯一相應的REQ,分別。 REP實體在步驟進鎖雙值的通信關係,因此也提供了一個等待響應,REQ側的期望接收的REP側的已接收到的消息之後。