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

news2024/12/23 13:59:49

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言读取 ini 配置文件,修改/添加键值对

C语言读取 ini 配置文件&#xff0c;修改/添加键值对 C语言读取 ini 配置文件&#xff0c;对section中的键值对进行修改/添加&#xff0c;如果section不存在&#xff0c;则在末尾将新的section/key/value 添加进去。 一、了解什么是INI文件&#xff1f; ini 文件是Initializ…

2022蓝帽杯取证初赛

检材&#xff1a;https://pan.baidu.com/s/1ibOdxyCWeC5x0DQKjwcz7w?pwdvg6g 目录 手机取证1、627604C2-C586-48C1-AA16-FF33C3022159.PNG图片的分辨率是&#xff1f;&#xff08;答案参考格式&#xff1a;19201080&#xff09;2、姜总的快递单号是多少&#xff1f;&#xff0…

【2024软件测试面试必会技能】Jmeter_性能测试(4):性能测试脚本的优化

性能测试脚本的优化 以PHP论坛为例&#xff1a;http://47.107.178.45/phpwind/ 根据上一篇的性能测试(3&#xff09;的脚本进行优化&#xff1b;见下图&#xff1a; 如上图中&#xff0c;把发帖和回帖的事务添加到随机控制器中&#xff0c;登录操作添加到仅一次控制器中&…

yolov5转换成TensorRT推理过程笔记

笔记内容来自 B站 手写AI 一、用硬代码实现 GitHub - wang-xinyu/tensorrtx: Implementation of popular deep learning networks with TensorRT network definition API 安装python、cuda11.2、cudnn对应cuda11.2软件 1、在yolov5-master下训练完成后生成best.pt文件(训练时…

Vue模版语法之属性绑定v-bind

双大括号不能在 HTML 属性中使用。想要响应式地绑定一个属性&#xff0c;应该使用 v-bind 指令 1. 使用v-bind绑定属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>新建页面</title><sc…

Vue3实现带动画效果的tab栏切换

效果图如下所示&#xff1a; 实现思路&#xff1a; 其实很简单 1、首先切换tab栏时tab标签激活下标与对应显示内容下标要一致。 2、其次点击tab栏切换时更新下标 3、最后就是css添加动画效果 这样就了&#xff01;&#xff01;&#xff01; 上全部代码 <template><…

有方机器人 STM32智能小车 项目学习笔记1

今天开始学习有方机器人--智能小车项目&#xff0c;正点原子部分的学习先放一放&#xff0c;还是小车更有吸引力哈哈。 新建工程及工程模板搭建 新建工程须知 目前常用的 STM32 的开发方式主要有基于寄存器编程、基于标准库函数编程、基于 HAL 库编程这三种。 寄存器版本--…

滤波电阻器:用于能源系统和工业的高精度解决方案(1)?

滤波电阻器用于防止能源系统中的电源反馈。铝厂或钢铁厂中的大型感应冶炼厂会产生与电源频率的谐波。必须不惜一切代价让这些远离电网。过滤器&#xff0c;通常以 T 或 L 元素的形式用于此目的。中压电源输入端的吸收电路由电容和电感的串联连接组成&#xff0c;对谐波进行负载…

【每日一题】106. 从中序与后序遍历序列构造二叉树-2024.2.21

题目: 106. 从中序与后序遍历序列构造二叉树 已解答 中等 相关标签 相关企业 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder = [9,3,15,20,7], pos…

Java Web(七)__Tomcat(二)

Tomcat工作模式 Tomcat作为Servlet容器&#xff0c;有以下三种工作模式。 1&#xff09;独立的Servlet容器&#xff0c;由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行&#xff0c;Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…

防御第六次作业-防火墙综合实验(av、url过滤、dns过滤)

目录 拓扑图&#xff1a; 要求&#xff1a; 8 9 10 11 拓扑图 要求 前7个要求在上一篇博客&#xff1b; 8.分公司内部的客户端可以通过域名访问到内部的服务器 9.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要…

【Vuforia+Unity】AR02-长方体物体识别

1.创建模型 选择多维长方体图&#xff0c;这个长方体是生活中的真实物体的拍摄图&#xff0c;提前把6个面拍摄好并裁剪干净。 官网创建模型https://developer.vuforia.com/targetmanager/project/targets?projectId0ddbb5c17e7f4bf090834650bbea4995&avfalse 设置长宽高…

Python开源项目周排行 2024年第4周

#2024年第4周2024年2月18日1Awesome-LLM一个精选的大型语言模型 (LLM) 资源列表&#xff0c;涵盖了以下内容&#xff1a; LLM 模型介绍 论文和代码 部署工具 应用场景 教程和示例 Awesome-LLM 的目标是帮助人们了解和使用 LLM 技术&#xff0c;并为 LLM 开发人员提供一个资源中…

从零开始学习PX4源码1(两个三维矢量如何转换成四元数)

目录 文章目录 目录摘要参考网址推导过程 摘要 本节主要记录px4如何从两个三维旋转矢量转换到四元数的过程&#xff0c;欢迎批评指正&#xff01;&#xff01;&#xff01; 参考网址 三维矢量转四元数 推导过程

【开源】JAVA+Vue.js实现高校学生管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学生选课模块2.4 成绩管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学院课程表3.2.3 学生选课表3.2.4 学生成绩表 四、系统展示五、核心代码5.1 查询课程5.2 新…

详解动态内存管理!

目录 ​编辑 1.为什么要用动态内存分配 2.malloc和free 2.1 malloc 2.2 free 3.calloc和realloc 3.1 calloc 3.2 realloc 4.常见的动态内存的错误 4.1 对NULL的解引用操作 4.2 对动态内存开辟空间的越界访问 4.3 对非动态内存开辟空间用free释放 4.4 使用free释放动…

unity打包apk运行于google手机

第一次打包apk运行于Pixel 7 Pro 一直提示安装包无法安装 untiy版本2020.1.0f1 有两点需要注意 第一 Scrpting Backend 需要选择 IL2CPP 勾选 ARM64 第二 勾选 Custom Main Mainfest 在Assets -> Plugins -> Android文件夹下 AndroidMainfest 中增加android:export…

软件实例分享,饭店餐饮会员卡管理系统怎么弄会员充值怎么记账

软件实例分享&#xff0c;饭店餐饮会员卡管理系统怎么弄会员充值怎么记账 一、前言 以下软件教程以 佳易王餐饮会员管理系统软件V16为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、会员可以登记电子会员卡或使用vip卡片 2、卡类型可以自由…

[云原生] 二进制安装K8S一部分

一、单机matser预部署设计 目前Kubernetes最新版本是v1.25&#xff0c;但大部分公司一般不会使用最新版本。 目前公司使用比较多的&#xff1a;老版本是v1.15&#xff0c;因为v1.16改变了很多API接口版本&#xff0c;国内目前使用比较多的是v1.18、v1.20。 组件部署&#xff…

【网络安全】电竞选手Faker遭受DDOS攻击,为什么它一直存在,我们遇到ddos攻击怎么办?

二十年前中国红客们就在用的DDOS攻击&#xff0c;直到现在还依然是黑客们最爱的攻击方法&#xff0c;为什么它一直存在&#xff1f; Faker各位小伙伴们自然是相当熟悉了&#xff0c;素有着英雄联盟第一人之称的Faker&#xff0c;其所拥有的荣誉让无数职业选手望其项背&#xf…