Socket通信---Python发送数据给C++程序

0. Problems

很多时候实现某种功能,需要在不同进程间发送数据,目前有几种主流的方法,如
让python和C/C++程序互相发送数据,其实有几种方法:

  • 共享内存
  • 共享文件
  • Socket通信

在这里只提供Socket通信的例程,共享文件很容易实现,就是可靠性差点,共享内存也是一种常用的方法。

其实,如果使用的是ROS框架,更加方便,提供了三种通信方法 (Topic/Server/Action),具体内容可以看我之前的ROS Learning篇的内容,请点这里。

1. Solutions

先上例程

1)Python端发送:
import socket
import json

# 创建Socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接C++程序
cpp_host = '127.0.0.1'  # C++程序所在的主机
cpp_port = 8888  # C++程序监听的端口
sock.connect((cpp_host, cpp_port))

# 读取json文件并发送给C++程序
with open('response.json', 'r') as file:
    json_data = file.read()
    sock.sendall(json_data.encode())

# 接收C++程序的响应
response = sock.recv(1024).decode()
if len(response) > 0:
    print("Received response from C++ program:", response)
else:
    print("Failed to receive response from C++ program.")

# 关闭Socket连接
sock.close()
2)C++端接收:
/*
 * @Descripttion: Robot2.5
 * @version: 20220211
 * @Author: Will Yip
 * @Date: 2024-02-21 15:43:37
 * @LastEditors: Will Yip
 * @LastEditTime: 2024-02-21 16:25:42
 */
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    // 创建Socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // 绑定Socket到指定端口
    sockaddr_in addr{};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8888);  // 监听的端口
    addr.sin_addr.s_addr = INADDR_ANY;

    bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));

    // 监听连接
    listen(sockfd, 1);

    // 接受连接
    sockaddr_in clientAddr{};
    socklen_t clientAddrLen = sizeof(clientAddr);
    int clientSock = accept(sockfd, (struct sockaddr *)&clientAddr, &clientAddrLen);

    // 接收来自Python程序的数据
    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    int bytesRead = recv(clientSock, buffer, sizeof(buffer), 0);

    // 判断是否接收到了数据
    if (bytesRead > 0) {
        // 处理收到的数据(这里假设数据是JSON格式)
        std::cout << "Received JSON data from Python program: " << buffer << std::endl;

        // 发送响应给Python程序
        const char* response = "Data received successfully!";
        send(clientSock, response, strlen(response), 0);
    } else {
        std::cout << "Failed to receive data from Python program." << std::endl;
    }

    // 关闭连接
    // close(clientSock); // dont close this connection, it will causes a problem when relaunch this receiver next time, it cant create 8888 port.
    close(sockfd);

    return 0;
}

然后就可以开始测试了,记住要先启动C++接收端,再启动python发送端,不然就报错,提示connection error


在调试时也会用上一些指令,可以帮助我们做一些检查

在Ubuntu中有两个常用的指令用来查看端口情况:

  • netstat
  • lsof

这两个指令都能显示当前的端口信息。

  1. netstat
    常用netstat -tuln,加上后面的参数可以帮助显示TCP和UDP协议的端口
    • -t表示显示TCP协议的端口;
    • -u表示显示UDP协议的端口;
    • -l表示仅显示监听状态的端口;
    • -n表示以数字形式显示地址和端口号,而不是尝试解析主机名、服务名等。

显示如下: netstat

  1. lsof
    lsof的用法是lsof -i:port_num,里面的port_num就是端口号,可以是根据netstat查询到的端口号。
    PS:端口号前加不加空格都行,
    以下是示例:
    lsof

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

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

相关文章

不要浪费

解法&#xff1a; 记录一下tle的代码 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \n bool check(vector<int>& a, int l,int k) {int sum 0;for (int i 0; i < a.size() && l…

到底什么是CIDR(无类域间路由)?

【摘要】 CIDR&#xff08;无类域间路由&#xff09;是一种用于对互联网IP地址进行聚合和分配的技术。它通过改变IP地址的分配方式&#xff0c;有效地解决了IPv4地址空间不足的问题。本文将详细介绍CIDR的原理、使用方法以及它对互联网的影响&#xff0c;还会针对CIDR出三道例题…

在vue3中使用canvas实现雨滴效果

在vue3中使用canvas实现雨滴效果 这是封装的一个组件DotAndRain&#xff08; &#xff09; <script setup> import { ref, onMounted } from "vue"; import { onUnmounted } from "vue";let animationFrameId null;const el ref(null); let canv…

Day3 javaweb开发——登录认证

登录功能 没什么好写的&#xff0c;就是LoginController层里面要注入empService的对象 登录校验&#xff08;重点&#xff09; 没有校验的情况 没有登录之前&#xff0c;访问数据的网址需要跳转到登录页面。 http是无状态的&#xff0c;处理其他业务时没有判断他是否登录 …

LINUX读取RTC实时时钟时间

linux 读写RTC时间_linux rtc 读写-CSDN博客

[newstarctf2023] --RE wp

AndroGenshin: rc4加密表&#xff0c;base64换表&#xff1a; 脚本梭就行 python username b"genshinimpact" base64_table [125, 239, 101, 151, 77, 163, 163, 110, 58, 230, 186, 206, 84, 84, 189, 193, 30, 63, 104, 178, 130, 211,164, 94, 75, 16, 32, 33…

anomalib1.0学习纪实-续4:做个小结

我们就以padim为例。 一、主入口&#xff1a; 二、Padim类。 这个Padim类就在src\anomalib\models\image\padim文件夹下。 这个Padim类的父类就是 AnomalyModule&#xff0c;这个父类你不能改动了&#xff0c;里面的内容写死了。 这个Padim类&#xff0c;最重要的是&#xf…

基于Spring Boot的学生评奖评优管理系统,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1760641819451928577

vue 非父子通信-event bus 事件总线

1.作用 非父子组件之间&#xff0c;进行简易消息传递。(复杂场景→ Vuex) 2.步骤 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09; import Vue from vue const Bus new Vue() export default Bus A组件&#xff08;接受方&#xff09;&#xff0c;监听Bus的…

jvm垃圾收集器-三色标记算法

1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“存活”着&#xff0c;哪些已经“死去”&#xff08;即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…

MyBatisPlus常用注解

目录 一、TableName 二、TableId 三、TableField 四、TableLogic 一、TableName 在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操作的表为user表 由此得出…

飞天使-k8s知识点22-kubernetes实操7-ingress

文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;它管理外部访问集群内部服务的规则。你可以将其视为一个入口&#xff0c;它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…

海思3559 yolov5 wk模型部署笔记

文章目录 安装3559工具链编译opencv编译项目总结 安装3559工具链 将3559工具链copy到虚拟机上&#xff0c;并解压得到安装包 解压&#xff1a; tar -zxvf aarch64-himix100-linux.tgz解压后会得到安装包文件夹&#xff1a; 安装工具链&#xff1a; sudo ./aarch64-himix100…

用 Python 自动化处理无聊的事情

“编程最棒的部分就是看到机器做一些有用的事情而获得的胜利。用 Python 将无聊的事情自动化将所有编程视为这些小小的胜利&#xff1b;它让无聊变得有趣。” Hilary Mason&#xff0c;数据科学家兼 Fast Forward Labs 创始人 “我很享受打破东西然后把它们重新组合起来的乐趣…

SPSSAU【文本分析】|文本聚类

SPSSAU共提供两种文本聚类方式&#xff0c;分别是按词聚类和按行聚类。按词聚类是指将需要分析的关键词进行聚类分析&#xff0c;并且进行可视化展示&#xff0c;即针对关键词进行聚类&#xff0c;此处关键词可以自由选择。按行聚类分析是指针对以‘行’为单位进行聚类分析&…

陈世元:被保送中科院,两次被裁,人生不能老是按部就班的走下去,需要冒险,尝试一下新的东西

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。 本期我们邀请的程…

【Qt学习】QLineEdit 控件 属性与实例(登录界面,验证密码,正则表达式)

文章目录 1. 介绍2. 实例使用2.1 登录界面2.2 对比两次密码是否相同2.3 通过按钮显示当前输入的密码&#xff08;并对2.2进行优化&#xff09;2.4 结语 3. 正则表达式3.1 QRegExp3.2 验证输入内容 4. 资源代码 1. 介绍 关于 QLineEdit 的详细介绍&#xff0c;可以去查阅官方文…

Web安全之浅见

备注&#xff1a;这是我在2017年在自己的网站上写的文章&#xff0c;今天迁移过来。 昨天去参加了公司组织的一个关于网络安全的培训&#xff0c;了解了很多关于网络安全方面的知识&#xff0c;也才意识到网络安全是一项极其重要的领域。 本篇文章主要聊聊Web安全。不过我对于网…

vue3使用pinia-plugin-persistedstate 持久化不生效的问题

如下图所示&#xff0c;需要在路由拦截器里面写。不然一个都不生效。 【即使以前生效的&#xff0c;在下图【红框】中定义一下&#xff0c;也会失效。得挪到路由拦截器里面才行】 终于出来了

【GPTs分享】每日GPTs分享之Canva

简介 Canva&#xff0c;旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片&#xff0c;Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成&#xff1a;根据用户的描述和创意需求&#xff0c;生成定制的设…