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.mzph.cn/news/694911.shtml

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

相关文章

面试复盘——10——一面全答了,二面全挂了...

前言 跨越了两年的一场面试hhhh&#xff0c;一面答的很不错&#xff0c;但可惜二面&#xff0c;基本一个没说上来…很离谱。 一面(23.12.29) 妈的&#xff0c;一面录音没录上。。。不管他了 二面(24.1.2) 为什么想从&#xff08;当前实习的地方&#xff09;离职 实习项目…

挑战30天学完Python:Day16 日期时间

&#x1f4d8; Day 16 &#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点…

shell脚本用法小记

shell脚本用法小记 1. 参数含义1.1 参数"-z"的含义 2. 语法小记if语法 1. 参数含义 1.1 参数"-z"的含义 在shell 脚本中&#xff0c; -z 是一个选项&#xff0c;用于判断字符串是否为空。 if [ -z $2 ]; thenros2 run workspace_name node_name --ros-a…

奇异递归模板模式应用5-静态多态

动态多态&#xff1a;C动态多态是利用虚函数特性实现的&#xff0c;即基类指针(引用&#xff09;指向派生类指针(引用)。由于虚函数的实现是在运行期进行的&#xff0c;因而会产生运行期开销&#xff08;虚表指针偏移&#xff0c;与分支预测器和CPU指令流水线相关&#xff09;。…

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.02.10-2024.02.15

2024.02.10–2024.02.15&#xff1a; arXiv中发表的关于大语言模型&#xff08;LLMs&#xff09;相关的文章&#xff0c;已经筛选过一部分&#xff0c;可能有的文章质量并不是很好&#xff0c;但是可以看出目前LLM的科研大方向&#xff01; 后续我会从中选择出比较有意思的文章…

【关于深度学习的一些资料】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 动手学深度学习Awesome Deep LearningTensorFlow Official ModelsPyTorch Image ModelsDeep Reinforcement LearningNeural Style Transfer 动手学深度学习 动手学深度学习 https://zh.d2l.ai/chapter_installation/index.…

Java Web(七)__Tomcat(二)

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

Java开发中计算金额时使用什么数据类型?(企业真题)

Java开发中计算金额时使用什么数据类型&#xff1f; 不能使用float或double&#xff0c;因为精度不高。不容许舍入误差 使用BigDecimal类替换&#xff0c;可以实现任意精度的数据的运算。

Java Web(七)__Tomcat(一)

JavaWeb 服务器 介绍 为什么需要&#xff1f; Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff0c;让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。Web服…

Web安全之浅见

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

【 OpenGL 教程06 】 关于着色器(01)

一、说明 着色器是目前做3D图形最流行的方式。而对应的OpenGL操作晦涩难懂&#xff0c;本篇试图参照一些相关解释文档&#xff0c;以及一个代码案例进行分解说明。 二、OpenGL的渲染管线流程 数据传输到显示环节的数据流程。 OpenGL—>顶点处理器—>细分着色—>几何处…

C语言:指针(一)

目录 1.内存和地址2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 解引用操作符&#xff08;*&#xff09; 2.3 指针变量的大小 3.指针变量的类型和意义3.1 指针的解引用3.2 指针 -指…

[云] vmware: latency的设置

https://docs.vmware.com/en/VMware-vSphere/8.0/vsphere-vm-administration/GUID-F5DAC793-7B13-418F-949E-0CD80CEC5D1E.html Configure the Virtual Machine Latency Sensitivity 如果虚拟机上的业务&#xff0c;需要敏感的网络延迟&#xff0c;就需要设置这个参数来做调整…

【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB

前言 本人的个人博客站点&#xff08;https://www.darkathena.top &#xff09;基于Halo博客系统搭建&#xff0c;该博客系统后端可以配置多种数据库&#xff0c;默认为H2&#xff0c;但是最新版已不建议使用H2&#xff0c;而是建议使用mysql/postgresql等数据库。经验证&…

【PyTorch][chapter 17][李宏毅深度学习]【无监督学习][ Auto-encoder]

前言&#xff1a; 本篇重点介绍AE&#xff08;Auto-Encoder&#xff09; 自编码器。这是深度学习的一个核心模型. 自编码网络是一种基于无监督学习方法的生成类模型,自编码最大特征输出等于输入 Yann LeCun&Bengio, Hinton 对无监督学习的看法. 目录&#xff1a; AE 模型原…

FPGA OSERDESE2

Output Parallel-to-Serial Logic Resources (OSERDESE2) OSERDESE2 在Xilinx 7 系列器件是一款专用的并行至串行转换器,具有特定的时钟和逻辑资源,旨在促进高速源同步接口的实现。每个OSERDESE2模块都包括一个专用的数据串行器和 3 状态控制。数据和 3 态串行器都可以在 SD…

Edwards爱德华STP系列-A1603分子泵使用维修保养说明

Edwards爱德华STP系列-A1603分子泵使用维修保养说明

注意pytorch的原地操作

常见的原地操作&#xff1a;nn.ReLu(inplaceTrue) a torch.randn(2) # tensor([-0.3690, 0.0626]) b a.clone() # tensor([-0.3690, 0.0626]) c a # tensor([-0.3690, 0.0626]) relu nn.ReLu(inplaceTrue)情况1 out relu(a) # tensor([0.0000, 0.0626]) a # tensor([…

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…

Flask数据库操作-Flask-SQLAlchemy

Flask中一般使用flask-sqlalchemy来操作数据库。flask-sqlalchemy的使用介绍如下&#xff1a; 一、SQLAlchemy SQLALchemy 实际上是对数据库的抽象&#xff0c;让开发者不用直接和 SQL 语句打交道&#xff0c;而是通过 Python 对象来操作数据库&#xff0c;在舍弃一些性能开销…