zmq_send
是 ZeroMQ 库中用于发送消息的函数,函数原型如下:
int zmq_send(void *socket, const void *buf, size_t len, int flags);
参数说明:
socket
:要发送消息的 Socket。buf
:要发送的消息内容的指针。len
:要发送的消息内容的长度。flags
:发送消息的选项,可以为以下常量的按位或:
ZMQ_NOBLOCK
:非阻塞方式发送消息。ZMQ_SNDMORE
:指示当前消息为多个消息序列中的一个。返回值:
errno
为适当的错误码。函数说明:
zmq_send
函数用于发送一条消息到指定的 Socket,可以是 ZMQ_REQ
、ZMQ_REP
、ZMQ_PUB
、ZMQ_SUB
等。buf
可以是任意类型的数据,以字节数组的形式传递,len
参数表示消息内容的长度。flags
参数可以控制发送消息的选项,常用的选项包括非阻塞方式发送和多个消息序列中的一个。errno
为适当的错误码。可以通过 zmq_strerror(errno)
来获取对应错误码的错误信息。zmq_send
函数是线程安全的,可以在多个线程中同时调用。char *msg = "Hello, ZeroMQ!";
int rc = zmq_send(socket, msg, strlen(msg), 0);
if (rc == -1) {
printf("发送消息失败:%s\n", zmq_strerror(errno));
}
在上述示例中,我们定义了一个要发送的消息内容 msg
,并调用 zmq_send
函数发送消息。如果发送失败,可以通过 zmq_strerror(errno)
打印错误信息。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zmq.h>
int main() {
void *context = zmq_ctx_new(); // 创建一个ZeroMQ上下文
void *socket = zmq_socket(context, ZMQ_REQ); // 创建一个REQuest类型的Socket
int rc = zmq_connect(socket, "tcp://localhost:5555"); // 连接到服务器端的地址和端口
if (rc != 0) {
printf("连接失败:%s\n", zmq_strerror(errno));
zmq_close(socket);
zmq_ctx_destroy(context);
return -1;
}
char *msg = "Hello, ZeroMQ!";
rc = zmq_send(socket, msg, strlen(msg), 0); // 发送消息
if (rc == -1) {
printf("发送消息失败:%s\n", zmq_strerror(errno));
zmq_close(socket);
zmq_ctx_destroy(context);
return -1;
}
printf("成功发送消息: %s\n", msg);
zmq_close(socket); // 关闭Socket
zmq_ctx_destroy(context); // 销毁ZeroMQ上下文
return 0;
}
解析:
我们创建了一个 ZeroMQ 上下文 context
,它可以看作是一个容器,用于保存 ZeroMQ 运行时的状态信息。
通过调用 zmq_socket
函数创建了一个 Socket。这个 Socket 类型是 ZMQ_REQ
,即请求-应答模式。
通过调用 zmq_connect
函数来连接到服务器端的地址和端口。这里我们使用的是 TCP 协议,并传入 tcp://localhost:5555
作为连接地址。
如果连接失败,将会打印错误信息,并调用 zmq_close
关闭 Socket,然后调用 zmq_ctx_destroy
函数销毁上下文,并返回 -1。
然后,我们构造了要发送的消息内容 msg
,并调用 zmq_send
函数来发送消息。这里我们传入了Socket、消息内容 msg
,以及消息的长度,最后一个参数为0表示无特殊选项。
如果发送消息失败,将会打印错误信息,并调用 zmq_close
关闭 Socket,然后调用 zmq_ctx_destroy
函数销毁上下文,并返回 -1。
如果成功发送消息,将会打印成功发送的消息内容。
最后,我们调用 zmq_close
关闭 Socket,然后调用 zmq_ctx_destroy
函数销毁上下文。
zmq_recv
是 ZeroMQ 库中用于接收消息的函数,函数原型如下:
int zmq_recv(void *socket, void *buf, size_t len, int flags);
参数说明:
socket
:要接收消息的 Socket。buf
:用于存储接收到的消息内容的缓冲区指针。len
:缓冲区的大小,即要接收的消息内容的最大长度。flags
:接收消息的选项,可以为以下常量的按位或:
ZMQ_NOBLOCK
:非阻塞方式接收消息。返回值:
errno
为适当的错误码。函数说明:
zmq_recv
函数用于从指定的 Socket 接收一条消息,可以是 ZMQ_REQ
、ZMQ_REP
、ZMQ_PUB
、ZMQ_SUB
等。buf
指向的缓冲区内,len
参数表示缓冲区的大小,即要接收的消息内容的最大长度。flags
参数可以控制接收消息的选项,常用的选项包括非阻塞方式接收。errno
为适当的错误码。可以通过 zmq_strerror(errno)
来获取对应错误码的错误信息。zmq_recv
函数是线程安全的,可以在多个线程中同时调用。使用示例:
char buf[1024];
int rc = zmq_recv(socket, buf, sizeof(buf), 0);
if (rc == -1) {
printf("接收消息失败:%s\n", zmq_strerror(errno));
} else {
printf("接收到的消息:%s\n", buf);
}
在上述示例中,我们定义了一个用于存储接收到的消息内容的缓冲区 buf
,并调用 zmq_recv
函数接收消息。如果接收失败,可以通过 zmq_strerror(errno)
打印错误信息。如果接收成功,可以通过 buf
获取接收到的消息内容。
示例代码:
#include <zmq.h>
#include <stdio.h>
#include <string.h>
int main()
{
void* ctx = zmq_ctx_new(); // 创建一个新的ZeroMQ上下文
void* sock = zmq_socket(ctx, ZMQ_REP); // 创建一个Reply类型的socket
int rc = zmq_bind(sock, "tcp://*:5555"); // 绑定socket到本地5555端口
if (rc != 0)
{
printf("Socket binding failed\n");
return -1;
}
char buffer[256];
while (1)
{
zmq_recv(sock, buffer, sizeof(buffer)-1, 0); // 接收消息
printf("Received message: %s\n", buffer);
strcpy(buffer, "World"); // 准备回复消息
zmq_send(sock, buffer, strlen(buffer), 0); // 发送回复消息
}
zmq_close(sock); // 关闭socket
zmq_ctx_destroy(ctx); // 销毁ZeroMQ上下文
return 0;
}
解析:
zmq.h
头文件,这是ZeroMQ的C语言API头文件。zmq_ctx_new()
函数用于创建一个ZeroMQ上下文,它是管理ZeroMQ的资源的主要对象。zmq_socket()
函数用于创建一个socket对象,并指定其类型。在本例中,我们使用ZMQ_REP
类型,即Reply类型的socket。zmq_bind()
函数用于将socket绑定到指定的地址和端口。在本例中,我们将socket绑定到本地的5555端口。buffer
,用于存储接收和发送的消息。zmq_recv()
函数用于接收消息,并将其存储在指定的缓冲区中。它的参数包括socket对象,缓冲区,缓冲区大小和一些可选的标志。strcpy()
函数将接收到的消息复制到另一个缓冲区,以便准备回复消息。zmq_send()
函数用于发送消息。它的参数包括socket对象,要发送的消息,消息的长度和一些可选的标志。zmq_close()
函数关闭socket对象,并使用zmq_ctx_destroy()
函数销毁ZeroMQ上下文,释放所有相关资源。这是一个简单的示例代码,演示了如何使用ZeroMQ的zmq_recv()
函数接收消息。在实际应用中,您可能需要根据您的需求进行更多的错误处理和逻辑控制。示例代码:
#include <zmq.h>
#include <stdio.h>
#include <string.h>
int main()
{
void* ctx = zmq_ctx_new(); // 创建一个新的ZeroMQ上下文
void* sock = zmq_socket(ctx, ZMQ_REP); // 创建一个Reply类型的socket
int rc = zmq_bind(sock, "tcp://*:5555"); // 绑定socket到本地5555端口
if (rc != 0)
{
printf("Socket binding failed\n");
return -1;
}
char buffer[256];
while (1)
{
zmq_recv(sock, buffer, sizeof(buffer)-1, 0); // 接收消息
printf("Received message: %s\n", buffer);
strcpy(buffer, "World"); // 准备回复消息
zmq_send(sock, buffer, strlen(buffer), 0); // 发送回复消息
}
zmq_close(sock); // 关闭socket
zmq_ctx_destroy(ctx); // 销毁ZeroMQ上下文
return 0;
}
解析:
zmq.h
头文件,这是ZeroMQ的C语言API头文件。zmq_ctx_new()
函数用于创建一个ZeroMQ上下文,它是管理ZeroMQ的资源的主要对象。zmq_socket()
函数用于创建一个socket对象,并指定其类型。在本例中,我们使用ZMQ_REP
类型,即Reply类型的socket。zmq_bind()
函数用于将socket绑定到指定的地址和端口。在本例中,我们将socket绑定到本地的5555端口。buffer
,用于存储接收和发送的消息。zmq_recv()
函数用于接收消息,并将其存储在指定的缓冲区中。它的参数包括socket对象,缓冲区,缓冲区大小和一些可选的标志。strcpy()
函数将接收到的消息复制到另一个缓冲区,以便准备回复消息。zmq_send()
函数用于发送消息。它的参数包括socket对象,要发送的消息,消息的长度和一些可选的标志。zmq_close()
函数关闭socket对象,并使用zmq_ctx_destroy()
函数销毁ZeroMQ上下文,释放所有相关资源。这是一个简单的示例代码,演示了如何使用ZeroMQ的zmq_recv()
函数接收消息。在实际应用中,您可能需要根据您的需求进行更多的错误处理和逻辑控制。