【问题标题】:Sending ZeroMQ data using TCP使用 TCP 发送 ZeroMQ 数据
【发布时间】:2016-04-27 09:25:56
【问题描述】:

我正在尝试制作一个简单的服务器。

我被限制使用的语言是 c++。

我正在使用ZeroMQ。

我已经创建了一个简单的服务器和一个客户端,如文档中所示。

ZeroMQ 使用 TCP 而不是 HTTP。

我知道HTTP的底层是TCP,所以我想知道使用TCP而不是HTTP会不会有性能问题。

对于HTTP,我可以使用curl来测试应用程序。

TCP 应该使用什么(curl 命令向带有字符串参数的套接字发送请求)。


服务器:

#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;
}

【问题讨论】:

  • 来自 RFC 2616:HTTP 通信通常通过 TCP/IP 连接进行。默认端口是 TCP 80,但也可以使用其他端口。这并不排除 HTTP 在 Internet 或其他网络上的任何其他协议之上实现。 HTTP 只假定可靠的传输;可以使用任何提供此类保证的协议; HTTP/1.1 请求和响应结构到相关协议的传输数据单元的映射超出了本规范的范围。
  • @Yogesh 我知道 http 是基于 tcp 构建的。我也了解http的请求响应结构。我的问题是如何使用 curl 查询套接字。并且使用 tcp 会产生任何性能开销吗?
  • 使用较低的层只能提高性能,而不是让它变得更糟。
  • 虽然我倾向于同意,但它不是较低层而是并行层,因为它是 TCP 之上的 ZeroMQ,就像它是 TCP 之上的 HTTP。关于测试,使用以简单脚本语言实现的 ZMQ 库,例如Python。它提供了一个交互式外壳来快速发送一些消息。

标签: http tcp server zeromq


【解决方案1】:

Q1:使用TCP而不是HTTP会不会有任何性能问题?
A1:是的,会的。避免 HTTP-rich-re-wrap 数据对性能和延迟都有好处

Q2:我应该使用什么TCP向带有字符串参数的套接字发送请求?
A2:没有命令(curl命令)会帮助你。 ZeroMQ 使用某些行代码(假设它是通信对等方之间的普通协议),因此独立的命令行工具将无法匹配现成的行代码要求. 解决方案? 创建一个简单的 c 程序,它将使用一个命令行参数(例如字符串)并组装一个 ZeroMQ 层兼容的数据框架,以便与远程对等方通信.您还应该注意到,要使ZeroMQ REQ/REP 正式通信模式起作用,这个代理工具必须成为唯一的相应 REQ,分别。 REP 实体在 step-forward-locking diadic-communication 关系中,因此也提供了一个等待的响应,REQ 端期望在 REQ 之后收到strong>REP-方已收到消息。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2012-03-14
    • 2019-06-29
    • 2020-09-25
    • 2015-04-16
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多