libnanomsg详解

 libnanomsg,或简称为nanomsg,是一个高性能的消息传递库,它为开发者提供了简单且高效的“可扩展协议”实现。以下是对libnanomsg的详细解析:

一、基本概述

  • 项目地址:GitCode - 全球开发者的开源社区,开源代码托管平台 或 https://github.com/nanomsg/nanomsg
  • 编程语言:使用C语言编写,遵循C89标准,易于移植到多种平台。
  • 依赖项:依赖于POSIX pthreads和BSD套接字,跨平台兼容性好。
  • 构建系统:使用CMake作为构建系统,确保了在不同平台上的兼容性和易用性。

二、主要功能与特点

  1. 多种通信模式

    • 支持PAIR、BUS、REQREP、PUBSUB等多种通信模式,这些模式可以构建分布式系统的基本框架。
    • 提供了请求/回复、发布/订阅、调查者/响应者等常见的消息传递模式。
  2. 多种传输方式

    • 支持TCP、UNIX套接字、WebSocket等多种传输方式,提供了灵活的通信选择。
  3. 高性能

    • 设计目标之一是高性能,适用于需要快速消息传递的应用场景。
    • 对性能进行了优化,具有较高的运行效率和较低的内存开销。
  4. 跨平台

    • 支持Windows、Linux、MacOS X等多种操作系统,确保了项目的广泛适用性。
  5. 开源免费

    • 采用MIT许可证,开发者可以自由使用、修改和分发。
  6. 简单易用

    • 提供了简洁的API,开发者可以快速上手并集成到项目中。
    • 将复杂的网络通信协议进行了抽象和封装,简化了分布式系统间的通信。

三、应用场景

  1. 分布式系统

    • 在分布式系统中,nanomsg可以作为节点间通信的基础设施,支持高效的计算任务分发和结果收集。
  2. 微服务架构

    • 在微服务架构中,服务之间需要高效的消息传递机制,nanomsg提供的多种协议可以满足不同服务间的通信需求。
  3. 实时数据处理

    • 在实时数据处理系统中,nanomsg的高性能特性可以确保数据的快速传递和处理。
  4. 物联网(IoT)

    • 在物联网应用中,nanomsg可以用于设备间的消息传递,支持设备间的实时通信和数据交换。

四、安装与编译

  1. 下载源代码并安装

linux:

sudo apt-get install libnanomsg-dev

从源码编译安装:

git clone https://github.com/nanomsg/nanomsg.git
cd nanomsg
mkdir build
cd build
cmake ..
make
sudo make install
2.使用示例

服务端代码(server.c):

#include "nn.h"
#include "reqrep.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define URL "tcp://127.0.0.1:12580"

int main() {
    int sock = nn_socket(AF_SP, NN_REP);
    if (sock < 0) {
        perror("nn_socket");
        exit(1);
    }

    if (nn_bind(sock, URL) < 0) {
        perror("nn_bind");
        exit(1);
    }

    char *buf = NULL;
    while (1) {
        int bytes = nn_recv(sock, &buf, NN_MSG, 0);
        if (bytes < 0) {
            perror("nn_recv");
            exit(1);
        }
        printf("Received: %s\n", buf);
        nn_freemsg(buf);

        const char *response = "World";
        bytes = nn_send(sock, response, strlen(response) + 1, 0);
        if (bytes < 0) {
            perror("nn_send");
            exit(1);
        }
    }

    nn_close(sock);
    return 0;
}

客户端代码(client.c):

#include "nn.h"
#include "reqrep.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define URL "tcp://127.0.0.1:12580"

int main() {
    int sock = nn_socket(AF_SP, NN_REQ);
    if (sock < 0) {
        perror("nn_socket");
        exit(1);
    }

    if (nn_connect(sock, URL) < 0) {
        perror("nn_connect");
        exit(1);
    }

    const char *msg = "Hello";
    int bytes = nn_send(sock, msg, strlen(msg) + 1, 0);
    if (bytes < 0) {
        perror("nn_send");
        exit(1);
    }

    char *buf = NULL;
    bytes = nn_recv(sock, &buf, NN_MSG, 0);
    if (bytes < 0) {
        perror("nn_recv");
        exit(1);
    }

    printf("Received: %s\n", buf);
    nn_freemsg(buf);

    nn_close(sock);
    return 0;
}

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

geoserver 瓦片地图,tomcat和nginx实现负载均衡

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;GeoServer作为一个强大的开源服务器&#xff0c;能够发布各种地图服务&#xff0c;包括瓦片地图服务。为了提高服务的可用性和扩展性&#xff0c;结合Tomcat和Nginx实现负载均衡成为了一个有效的解决方案。本文将详细…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

网络编程中的黏包和半包问题

引言 - 什么是黏包和半包&#xff1f; 在网络编程中&#xff0c;黏包和半包问题是常见的数据传输问题&#xff0c;尤其是在使用TCP协议时。Netty作为一个高性能的网络框架&#xff0c;提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题&#xff0c;以及Netty…

F5中获取客户端ip地址(client ip)

当F5设备对其原始设置上的所有IP地址使用NAT时&#xff0c;连接到poo成员&#xff08;nodes、backend servers&#xff09;的出站连接将是NAT IP地址。 pool 成员&#xff08;nodes、backend servers&#xff09;将无法看到真实的客户端 ip地址&#xff0c;因为看到的是F5上的…

【容器】k8s学习笔记原理详解(十万字超详细)

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据&am…

【他山之石】Leading-Trim: The Future of Digital Typesetting:数字排版的未来 —— Leading-Trim

文章目录 【他山之石】Leading-Trim: The Future of Digital Typesetting&#xff1a;数字排版的未来 —— Leading-TrimHow an emerging CSS standard can fix old problems and raise the bar for web apps1. The problem with text boxes today2. How we got here: a histor…

vue3修改elementui-plus的默认样式的几种方法

#创作灵感 今天写vue的前端项目&#xff0c;因为需要去修改elementui-plus中drawer的默认样式&#xff0c;所以刚好将修改步骤记录下来。 一共提供了三种方法&#xff0c;但亲测第二种最好用。 使用第二种是可以无视自己的代码中是否定义了该盒子&#xff0c;因为有时候盒子的…

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

MaskGCT——开源文本转语音模型,可模仿任何人说话声音

前期介绍过很多语音合成的模型&#xff0c;比如ChatTTS&#xff0c;微软语音合成大模型&#xff0c;字节跳动自家发布的语音合成模型Seed-TTS。其模型随着技术的不断发展&#xff0c;模型说话的声音也越来越像人类&#xff0c;虽然 seed-tts 可以进行语音合成等功能&#xff0c…

socket编程UDP-实现滑动窗口机制与累积确认GBN

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现了停等机制。 socket编程UDP-实现停…

Linux 网络流量控制 - 实现概述

摘要 Linux 提供了一整套丰富的流量控制(traffic control)功能。本文档概述了相应的内核代码设计&#xff0c;描述了其结构&#xff0c;并通过描述一种新的排队策略来说明新元素的添加。 1 引言 最近的Linux内核提供了多种流量控制功能。Alexey Kuznetsov&#xff08;kuznet…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时&#xff0c;报错 &#xff1a; System.Drawing.Common is not supported on this platform 平台特定实现&#xff1a; 对于Windows平台&#xff0c;System.Drawing.C…

AI视频配音技术创新应用与商业机遇

随着人工智能技术的飞速发展&#xff0c;AI视频配音技术已经成为内容创作者和营销人员的新宠。这项技术不仅能够提升视频内容的吸引力&#xff0c;还能为特定行业带来创新的解决方案。本文将探讨AI视频配音技术的应用场景&#xff0c;并讨论如何合法合规地利用这一技术。 AI视频…

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤&#xff1a;五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园&#xff08;在线个人知识库&#xff09;的经历&#xff0c;首先尝试的是网上普遍使用的方法&#xff0c;也就是本篇文章介绍的。 后面会继续…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart

NX系列-使用 `nmcli` 命令创建 Wi-Fi 热点并设置固定 IP 地址

使用 nmcli 命令创建 Wi-Fi 热点并设置固定 IP 地址 一、前言 在一些场景下&#xff0c;我们需要将计算机或嵌入式设备&#xff08;例如 NVIDIA Orin NX&#xff09;转换为 Wi-Fi 热点&#xff0c;以便其他设备&#xff08;如手机、笔记本等&#xff09;能够连接并使用该设备…

【Prometheus】Prometheus的样本

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…