【发布时间】: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。它提供了一个交互式外壳来快速发送一些消息。