zmq_send 简介:
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
:指示当前消息为多个消息序列中的一个。
返回值:
- 成功发送消息,返回发送的字节数。
- 发送消息失败,返回-1,并设置
errno
为适当的错误码。
函数说明:
zmq_send
函数用于发送一条消息到指定的 Socket,可以是ZMQ_REQ
、ZMQ_REP
、ZMQ_PUB
、ZMQ_SUB
等。- 消息内容
buf
可以是任意类型的数据,以字节数组的形式传递,len
参数表示消息内容的长度。 flags
参数可以控制发送消息的选项,常用的选项包括非阻塞方式发送和多个消息序列中的一个。- 当发送成功时,返回发送的字节数,如果消息的长度超过了套接字的缓冲区大小,可能会被截断。
- 当发送失败时,返回-1,并设置
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类型的Socketint 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); // 关闭Socketzmq_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 简介:
zmq_recv
是 ZeroMQ 库中用于接收消息的函数,函数原型如下:
int zmq_recv(void *socket, void *buf, size_t len, int flags);
参数说明:
socket
:要接收消息的 Socket。buf
:用于存储接收到的消息内容的缓冲区指针。len
:缓冲区的大小,即要接收的消息内容的最大长度。flags
:接收消息的选项,可以为以下常量的按位或:ZMQ_NOBLOCK
:非阻塞方式接收消息。
返回值:
- 成功接收消息,返回接收到的字节数。
- 接收消息失败,返回-1,并设置
errno
为适当的错误码。
函数说明:
zmq_recv
函数用于从指定的 Socket 接收一条消息,可以是ZMQ_REQ
、ZMQ_REP
、ZMQ_PUB
、ZMQ_SUB
等。- 接收到的消息内容将存储在
buf
指向的缓冲区内,len
参数表示缓冲区的大小,即要接收的消息内容的最大长度。 flags
参数可以控制接收消息的选项,常用的选项包括非阻塞方式接收。- 当接收到消息时,返回接收到的字节数,如果消息的长度超过了缓冲区的大小,可能会被截断。
- 当接收失败时,返回-1,并设置
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类型的socketint 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); // 关闭socketzmq_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对象,要发送的消息,消息的长度和一些可选的标志。- 循环回到第6步,继续等待接收和发送消息。
- 最后,使用
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类型的socketint 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); // 关闭socketzmq_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对象,要发送的消息,消息的长度和一些可选的标志。- 循环回到第6步,继续等待接收和发送消息。
- 最后,使用
zmq_close()
函数关闭socket对象,并使用zmq_ctx_destroy()
函数销毁ZeroMQ上下文,释放所有相关资源。
这是一个简单的示例代码,演示了如何使用ZeroMQ的zmq_recv()
函数接收消息。在实际应用中,您可能需要根据您的需求进行更多的错误处理和逻辑控制。