zmq_send与zmq_recv

发布时间:2024年01月10日
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_REQZMQ_REPZMQ_PUBZMQ_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类型的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;
}

解析:

  1. 我们创建了一个 ZeroMQ 上下文 context,它可以看作是一个容器,用于保存 ZeroMQ 运行时的状态信息。

  2. 通过调用 zmq_socket 函数创建了一个 Socket。这个 Socket 类型是 ZMQ_REQ,即请求-应答模式。

  3. 通过调用 zmq_connect 函数来连接到服务器端的地址和端口。这里我们使用的是 TCP 协议,并传入 tcp://localhost:5555 作为连接地址。

  4. 如果连接失败,将会打印错误信息,并调用 zmq_close 关闭 Socket,然后调用 zmq_ctx_destroy 函数销毁上下文,并返回 -1。

  5. 然后,我们构造了要发送的消息内容 msg,并调用 zmq_send 函数来发送消息。这里我们传入了Socket、消息内容 msg,以及消息的长度,最后一个参数为0表示无特殊选项。

  6. 如果发送消息失败,将会打印错误信息,并调用 zmq_close 关闭 Socket,然后调用 zmq_ctx_destroy 函数销毁上下文,并返回 -1。

  7. 如果成功发送消息,将会打印成功发送的消息内容。

  8. 最后,我们调用 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_REQZMQ_REPZMQ_PUBZMQ_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类型的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;
}

解析:

  1. 首先,我们需要在代码中包含zmq.h头文件,这是ZeroMQ的C语言API头文件。
  2. zmq_ctx_new()函数用于创建一个ZeroMQ上下文,它是管理ZeroMQ的资源的主要对象。
  3. zmq_socket()函数用于创建一个socket对象,并指定其类型。在本例中,我们使用ZMQ_REP类型,即Reply类型的socket。
  4. zmq_bind()函数用于将socket绑定到指定的地址和端口。在本例中,我们将socket绑定到本地的5555端口。
  5. 创建一个字符数组buffer,用于存储接收和发送的消息。
  6. 进入无限循环,等待接收和发送消息。
  7. zmq_recv()函数用于接收消息,并将其存储在指定的缓冲区中。它的参数包括socket对象,缓冲区,缓冲区大小和一些可选的标志。
  8. 使用strcpy()函数将接收到的消息复制到另一个缓冲区,以便准备回复消息。
  9. zmq_send()函数用于发送消息。它的参数包括socket对象,要发送的消息,消息的长度和一些可选的标志。
  10. 循环回到第6步,继续等待接收和发送消息。
  11. 最后,使用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;
}

解析:

  1. 首先,我们需要在代码中包含zmq.h头文件,这是ZeroMQ的C语言API头文件。
  2. zmq_ctx_new()函数用于创建一个ZeroMQ上下文,它是管理ZeroMQ的资源的主要对象。
  3. zmq_socket()函数用于创建一个socket对象,并指定其类型。在本例中,我们使用ZMQ_REP类型,即Reply类型的socket。
  4. zmq_bind()函数用于将socket绑定到指定的地址和端口。在本例中,我们将socket绑定到本地的5555端口。
  5. 创建一个字符数组buffer,用于存储接收和发送的消息。
  6. 进入无限循环,等待接收和发送消息。
  7. zmq_recv()函数用于接收消息,并将其存储在指定的缓冲区中。它的参数包括socket对象,缓冲区,缓冲区大小和一些可选的标志。
  8. 使用strcpy()函数将接收到的消息复制到另一个缓冲区,以便准备回复消息。
  9. zmq_send()函数用于发送消息。它的参数包括socket对象,要发送的消息,消息的长度和一些可选的标志。
  10. 循环回到第6步,继续等待接收和发送消息。
  11. 最后,使用zmq_close()函数关闭socket对象,并使用zmq_ctx_destroy()函数销毁ZeroMQ上下文,释放所有相关资源。

这是一个简单的示例代码,演示了如何使用ZeroMQ的zmq_recv()函数接收消息。在实际应用中,您可能需要根据您的需求进行更多的错误处理和逻辑控制。

文章来源:https://blog.csdn.net/weixin_44248637/article/details/135513394
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。