我想製作一個簡單的服務器。使用TCP發送ZeroMQ數據
我被限制使用的語言是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
@Yogesh我明白,http是通過tcp構建的。我也理解http的請求響應結構。我的問題是如何使用curl查詢套接字。並使用TCP會造成任何性能開銷? –
使用較低層只能提高性能,而不會使情況變得更糟。 – EJP