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() {// 创建Socketint 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.hqwc.cn/news/484644.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】如何自定义事件并触发

前言 有些教程中说使用 Event.initEvent() 创建事件&#xff0c;但是此方法已弃用&#xff0c;所以下文使用new Event()。 mdn官方文档中&#xff0c;明确说明Event.initEvent()弃用。 建议使用Event()构造函数&#xff0c;这里以chrome为例&#xff0c;兼容请很强&#xff0c;…

[Git] 配置Access Token 解决Github 认证弹窗

[Git] 配置Access Token 解决Github 认证弹窗 1. 前言2. 解决2.1 申请Personal Access Token2.2. 配置Token2.3. 授权激活Token 博主热门文章推荐&#xff1a; 1. 前言 最近从bitbucket切换到了Github Enterprise, 刚使用几次发现 每次操作 都有弹窗认证&#xff0c; 虽然手动点…

六、回归与聚类算法 - 逻辑回归与二分类

线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、应用场景 2、原理 2.1 输入 2.2 激活函数 3、损失以及优化 3.1 损失 3.2 优化 4、逻辑回归API 5、分类的评估方法 5.1 精确率和召回率 5.2…

Vivado 2015.4安装记录

一、资源 安装破解包&#xff1a;Vivado2015.4,提取码&#xff1a;4eaw 二、安装 2.0、解压缩 2.0.1、解压缩Xilinx_Vivado_SDK_Win_2015.4_1118_2.tar.gz 2.0.2、解压缩Xilinx_Vivado_SDK_Win_2015.4_1118_2.tar 2.1、安装 Vivado四个版本&#xff1a; Vivado HL WebPCK&a…

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)

0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…

win32 汇编读文件

做了2个小程序&#xff0c;没有读成功&#xff1b;文件打开了&#xff1b; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

CPEOS:国家遥感数据与应用服务平台

文章目录 Main高分数据线上展厅遥感卫星技术成果支撑单位 Main 主页&#xff1a;https://www.cpeos.org.cn/home/ 高分数据 线上展厅 遥感卫星 技术成果 支撑单位

LeetCode刷题计划----day5

19 力扣链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 文章讲解链接&#xff1a;https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8…

【Docker实操】部署php项目

概述 最终达成的容器部署结构和原理如下图&#xff1a; 一、获取nginx、php官方镜像 docker pull nginx //拉取nginx官方镜像 docker pull php:7.4-fpm //拉取php官方镜像需要获取其他可用的php版本&#xff0c;可以上【docker hub】搜索【php】&#xff0c;所有的【xxx-fp…

day39打卡

day39打卡 62. 不同路径 状态表示 我们暂时设dp[i] [j]&#xff1a;以(i, j)为终点&#xff0c;所到达i使用的方法的数量 状态转移方程 从题目中可以看出&#xff0c;dp(i, j)的值取决于dp(i-1, j)和dp(i, j-1)的值&#xff0c;因为机器人只能向右或者向下走。 且我们猜测…

Web安全之浅见

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

springcloud-seata分布式事务

seata安装配置 下载 下载中心 | Seata 上传到linux 解压seata压缩包 tar -zxvf seata-server-1.6.1.tar.gz nacos配置 创建seata的命名空间 id: seata-id 配置seata 备份application.yml 进入/usr/local/software/springcloud/seata/conf文件夹 备份application.yml mv app…