2016-01-21 49 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侧的已接收到的消息之后。