【C++】6.网络编程:socket实现通信(文字、语音)

2023-05-16

常见的通信方式有文本、语音,下面用C++实现:

参考:

https://blog.csdn.net/Robot_hfut/article/details/102862052
https://blog.csdn.net/Ephemeroptera/article/details/100190973
https://blog.csdn.net/weixin_47232366/article/details/117520656

文章目录

    • 文字通信
    • 语音通信

文字通信

Windows和Linux间通过文本通信:

client.cpp(windows)

// windows客户端
#include <stdio.h>
#include <Windows.h>

#pragma comment(lib, "ws2_32.lib")
#define Port 5000
#define IP_ADDRESS "10.10.4.232"

int main(int argc, char* argv[])
{
	// 存储调用AfxSocketInit全局函数返回的Windows Sockets初始化信息
	WSADATA s; 
	SOCKET ClientSocket;
	struct sockaddr_in ClientAddr; // 一个sockaddr_in型的结构体对象
	int ret = 0;
	char SendBuffer[MAX_PATH];   // Windows的MAX_PATH默认是260

	// 初始化Windows Socket
	// WSAStartup函数对Winsock服务的初始化
	if (WSAStartup(MAKEWORD(2, 2), &s) != 0) // 通过连接两个给定的无符号参数,首个参数为低字节
	{
		printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
		getchar();
		return -1;
	}

	while (1)
	{
		// 创建一个套接口
		// 如果这样一个套接口用connect()与一个指定端口连接
		// 则可用send()和recv()与该端口进行数据报的发送与接收
		// 当会话结束后,调用closesocket()
		ClientSocket = socket(AF_INET, // 只支持ARPA Internet地址格式
			SOCK_STREAM, // 新套接口的类型描述
			IPPROTO_TCP); // 套接口所用的协议
		if (ClientSocket == INVALID_SOCKET)
		{
			printf("Create Socket Failed! Error: %d\n", GetLastError());
			getchar();
			return -1;
		}

		ClientAddr.sin_family = AF_INET;
		ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); // 定义IP地址
		ClientAddr.sin_port = htons(Port); // 将主机的无符号短整形数转换成网络字节顺序
		memset(ClientAddr.sin_zero, 0X00, 8); // 函数通常为新申请的内存做初始化工作

		// 连接Socket
		ret = connect(ClientSocket,
			(struct sockaddr*)&ClientAddr,
			sizeof(ClientAddr));
		if (ret == SOCKET_ERROR)
		{
			printf("Socket Connect Failed! Error:%d\n", GetLastError());
			getchar();
			return -1;
		}
		else
		{
			printf("Socket Connect Succeed!");
		}

		printf("Input Text: ");
		while (1)
		{
			scanf("%s", &SendBuffer);

			// 发送数据至服务器
			ret = send(ClientSocket,
				SendBuffer,
				(int)strlen(SendBuffer), // 返回发送缓冲区数据长度
				0);

			if (ret == SOCKET_ERROR)
			{
				printf("Send Information Failed! Error:%d\n", GetLastError());
				getchar();
				break;
			}

			break;
		}

		// 关闭socket
		closesocket(ClientSocket);
		if (SendBuffer[0] == 'q') // 设定输入第一个字符为q时退出
		{
			printf("Quit!\n");
			break;
		}

	}
	WSACleanup();
	getchar();
	return 0;
}

server.cpp(Linux)

// Linux服务端
#include <unistd.h>
#include <stdio.h>
#include <x86_64-linux-gnu/sys/socket.h>
#include <netinet/in.h>
#include <x86_64-linux-gnu/sys/types.h>
#include <stdlib.h>
#include <string.h>

#define SERVER_PORT 5000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 10

int main(int argc,char* argv[])
{
    struct sockaddr_in server_addr;
    int server_socket;
    int opt = 1;

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);  
    // server初始化
    server_socket = socket(PF_INET, SOCK_STREAM, 0);

    if (server_socket < 0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }


    // 绑定端口
    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    if(bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        printf("Server Bind Port: %d Failed!\n", SERVER_PORT);
        exit(1);
    }

    // 监听端口
    if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!\n");
        exit(1);
    }      

    while(1)
    {
        struct sockaddr_in client_addr;
        int client_socket;
        socklen_t length;
        char Buffer[BUFFER_SIZE];

        // 接收客户端消息
        length = sizeof(client_addr);
        client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
        if (client_socket < 0)
        {
            printf("Server Accept Failed!\n");
            break;
        }

        while(1)
        {
            bzero(Buffer, BUFFER_SIZE);
            length = recv(client_socket, Buffer, BUFFER_SIZE, 0);
            if (length < 0)
            {
                printf("Server Recieve Data Failed!\n");
                break;
            }           

            if ('q' == Buffer[0])
            {
                printf("Quit!\n");
                break;
            }

            printf("%s\n", Buffer);
            break;
        }

        close(client_socket);
    }

    close(server_socket);
    return 0;
}

实现效果如下:

在这里插入图片描述

语音通信

Windows间语音通信,即Windows端开个服务端,可以开很多客户端,来实现客户端间的通信。

以上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】6.网络编程:socket实现通信(文字、语音) 的相关文章

  • Canvas绘制地图

    在我们的大屏可视化项目中 xff0c 地图数据可视化是最常见功能 地图数据可视化目前的实现方案有很多 xff0c 其中最具有代表性的莫过于使用echarts xff0c 引入一个js文件 xff0c 再加上一些简单的配置 xff0c 这样一
  • 滚动动画(跑马灯动画)的几种实现方式

    在大屏可视化应用中 xff0c 滚动动效 xff08 跑马灯效果 xff09 也是常见的一种数据展现方式 xff0c 本章节针对字幕滚动和列表滚动效果做一个小小的总结 xff0c 结合vue框架 xff0c 具体展示效果如下 xff0c 从
  • 如何在Ubuntu上安装CUDA

    原链接 在Ubuntu上安装CUDA一直是比较麻烦的事情 由于不同版本的CUDA对显卡驱动有着不同的需求 而在有些电脑上安装最新的Nvidia闭源显卡驱动会导致无法进入图形界面 CUDA中也自带了Nvidia的显卡驱动 xff0c 但是如果
  • 加载loading动画

    提起加载 xff08 loading xff09 效果 xff0c 想必大家都不会陌生 xff0c 在目前的移动端 PC端 各类app均广泛使用 xff0c 使用loading动画能显著提升用户的交互体检 xff0c 尤其是在页面加载速度比
  • CSS锥形渐变实现环形进度条

    10月份因为疫情原因 又开启了居家办公模式 xff0c 空闲之余 xff0c 与其选择 躺平 xff0c 不如去做一些有意义的事情 xff0c 内心的想法驱使着我去做些什么 xff0c 但是又没有合适的素材 xff0c 直到接手了最近的一个
  • CSS实现个性化水球图

    在可视化应用中 xff0c 水球图也是一种常见的数据展示形式 xff0c 关于使用CSS实现个性化水球 xff0c 在相当长的一段时间并没有找到比较简洁的实现方式 xff0c 因此在以往的可视化作品中 xff0c 大多采用echarts插件
  • CSS实现3D球面字符云

    在大屏可视化应用中 xff0c 使用3D的场景有很多 xff0c 复杂的交互动画通常是使用Three js或echarts gl来实现 xff0c 但是在一些简单的3D场景中 xff0c CSS也可以实现一些不错的展示效果 本文使用CSS相
  • CSS实现渐变仪表盘的简单尝试

    在 CSS锥形渐变实现环形进度条 一章中 xff0c 讲解了实现渐变进度条的一点思路 xff0c 基于此思路 xff0c 本章节尝试性的使用CSS实现一个简单的渐变仪表盘 xff0c 给大家提供一些借鉴 实现角向渐变 xff0c 不得不提一
  • 【opencv】OpenCV开发环境配置(C++)

    软件版本 opencv 4 7 0 windowsvisual studio 2022 环境配置 1 创建项目 打开VS 2022 xff0c 点击创建新项目 点击项目 gt 点击属性 2 添加包含目录 点击VC 43 43 目录 gt 点
  • 1、什么是网络前缀

    基础知识 xff1a 1 已知一个IP地址 xff0c 如何区分它是A类地址还是B类或者C类地址呢 A类地址 1 0 0 0 到126 0 0 0 0 0 0 0 和127 0 0 0保留 B 类地址 128 1 0 0到191 254 0
  • ZYNQ petalinux设置固定IP地址

    背景 xff1a zynq petalinux在开机自启动以后ifconfig设置ip xff0c 然后运行应用程序 xff1b 如果设备没有串口且程序在启动过程中用Wireshark抓取不到信息 xff0c 这时 xff0c 就要使用固定
  • 10、IEEE802.3和Ethernet II帧的区别, 0x0806 ARP协议分析

    一 IEEE802 3和Ethernet II帧的区别 概念 xff1a 1 以太网上使用两种标准帧格式 第一种是上世纪80年代提出的DIX v2格式 xff0c 即Ethernet II格式 第二种是1983年提出的IEEE 802 3格
  • W10: Warning: Changing a readonly file使用vi/vim报错问题解决(使用管理员也不能修改)

    使用vi vim编辑文件的时候出现W10 Warning Changing a readonly file报错 解决方法 xff1a 一 强制保存退出 xff1a wq 二 ll 查询文件属主 xff0c 使用属主赋予权限 chmod u
  • 使用Galileo SDK跨局域网遥控机器人

    原链接 GalileoSDK是由我们开发的机器人导航系统SDK 通过SDK用户能够方便的操控机器人 现在小强用户已经可以免费体验到SDK的功能了 SDK内部集成了物联网连接功能 设置完成后用户能够通过SDK跨局域网遥控和获取机器人状态 下面
  • zcu102网口不通

    新建工程采用的板子默认配置 xff0c 启动后执行命令 xff1b dmesg grep ethernet 1 545671 macb ff0e0000 ethernet Not enabling partial store and for
  • zcu102开发板实现 虚拟jtag

    开发板zcu102 xff1b petalinux2020 1 需要自备一个FMC转JTAG的子卡 xff1b 此篇记录自己实现的过程 xff0c 以备查询 xff1b 1 整个流程连接 xff1a https xilinx wiki at
  • 查看ubuntu系统的版本信息、内存大小及使用、磁盘大小等常用命令

    一 ubuntu系统的版本信息 xff1a 方法 步骤 xff1a 1 进入Ubuntu系统 xff0c 点击左侧图标栏中的黑框 xff0c 打开终端 xff1b 2 左侧没有终端图标的情况 xff0c 可以搜索按钮 图中左侧第一个 xff
  • CentOS7 无法进入图形界面 黑屏

    问题现象描述 xff1a CentOS有界面的系统 xff0c 开机后进入界面 xff0c 在开机界面背景为 7 的地方卡住 xff0c 然后界面就黑掉 解决办法 xff1a 1 开机后 xff0c 按下 ctrl 43 alt 43 F2
  • 重装win10提示“Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装...”

    背景 xff1a 因为GHOST系统会捆绑大量软件 xff0c 主页被强制修改 xff0c 并且系统还可能存在删减的可能性 xff0c 所以越来越多的用户考虑安装官方MSDN原版系统 xff0c 但是呢 xff0c 近期总是有用户称自己在安
  • 在petalinux下提示:Failed to menu config project component....

    现象 xff1a 在petalinux下配置硬件描述语言时 xff0c 提示错误 xff1a 命令 xff1a petalinux config get hw description 61 hdf path 错误提示 xff1a ERROR

随机推荐

  • petalinux下修改系统空间笔记

    该文档是自己记录的笔记 xff0c 方便后面自己查看 在petalinux设置系统空间中需要注意的点 xff01 1 在menuconfig界面下设置系统空间为了在内核启动输出显示 xff1b Subsystem AUTO Hardware
  • PetaLinux 去除用户登陆 (Login into target without pass word)

    PetaLinux 自动登录登陆 1 初始化 PetaLinux 运行环境 xff1a source PetaLinux安装目录 settings sh 2 更改 PetaLinux 配置 xff1a 1 cd 到项目工程目录下 xff1b
  • PetaLinux 使用外部代码 (u-boot)

    背景 xff1a 在petalinux编译工程时 xff0c 我们可能有修改u boot源码的需求 xff0c 这时就需要我们使用外部的代码进行编译 实现步骤 xff1a 在配置前 xff0c 请确认我们已经在github上把对应的uboo
  • 异常的抛出和处理

    自定义输出异常 package error import java util ArrayList public class Exception public static void main String args TODO Auto ge
  • 在ROS中使用UDP进行通信

    原链接 ROS的网络通信提供了两种方式 xff0c 一种是TCP协议 xff0c 一种是UDP协议 默认采用TCP进行通信 但是在实际的WIFI网络使用中发现用户经常反馈客户端和机器人连接中断且无法重新建立连接 在ROS wiki中官方也有
  • 网络编程TCP/IP和UDP以及HTTP协议

    OSI的七层模型和TCP IP的四层模型 TCP IP协议是从OSI的七层模型中简化出来的 四层模型的详图 什么是HTTP协议 HTTP称为 超文本传输协议 是一种基于应用层的通信协议 xff0c 它允许将超文本标记语言 HTML 文档从W
  • 网络字节序之大小端(字节序与比特序)

    引言 xff1a 最近在网上看了很多博客 xff0c 想要深入了解大小端问题 xff0c 主要是做毕设时 xff0c RTP包协议的结构体定义有两种方式 xff0c 即大端和小端 但是一些博客并没有讲到理解大小端的本质问题 xff0c 在这
  • C++的编译流程

    C C 43 43 的编译流程 编译流程分为四个阶段 xff1a 预处理 编译 汇编 链接 以Linux系统下g 43 43 编译为例 xff1a 通过g 43 43 的选项可以查看过程中的每一步 预处理 xff1a 处理一些 号定义的命令
  • 【Autoware规控】Lattice规划节点

    文章目录 1 Lattice规划介绍2 相关代码 1 Lattice规划介绍 Lattice Planner 是一种基于栅格地图的规划算法 xff0c 通过搜索和优化实现路径规划的目的 Lattice Planner 的核心思想是将路径规划
  • 【Autoware规控】OpenPlanner规划节点

    文章目录 1 OpenPlanner介绍2 相关代码 1 OpenPlanner介绍 OpenPlanner是Autoware种使用的一种运动规划算法 xff0c 通过对全局路径采样后生成一系列的候选路径 xff0c 结合矢量地图 传感器结
  • 【C++】8.高效编程:Effective C++学习

    Effective C 43 43 改变程序与设计的55个具体做法 文章目录 1 将C 43 43 视为federation of languages xff08 语言联合体 xff09 2 用consts enums 和 inlines取
  • 【Qt web】内嵌CEF制作浏览器

    文章目录 1 CEF介绍2 环境配置3 示例程序 1 CEF介绍 Qt自带QWebEngine模块 xff0c 可以快速实现浏览器 xff0c 但在实际使用中 xff0c 某些AMD显卡电脑运行使用了QWebEngine的qt软件 xff0
  • 【C++】9.web应用:oatpp-web框架入门

    说到web开发 xff0c 大家肯定会想到JS Python xff0c 甚至Java xff0c 但应该不会想到C 43 43 用C 43 43 开发web也不是不行 xff0c 这不 xff0c oatpp就是一个轻量 跨平台 高性能的
  • 【Python】Excel数据上下翻转

    遇到一个问题 xff0c 需要将excel表格的数据上下翻转 xff0c 不是升序或者降序 xff0c 不然就不需要程序来实现了 网上也看了有些插件有这个功能 xff0c 但插件过于老旧 xff0c 下载都有问题 记录一下程序实现的过程 x
  • 【IPOPT】Ubuntu安装IPOPT非线性优化求解器

    IPOPT Interior Point OPTimizer 是一款开源的非线性优化求解器 xff0c 在自动驾驶规控中会用到 xff0c 之前在这里卡了很久 xff0c 现在终于装上了 ipopt文档 xff1a https coin o
  • 使用systemback制作Ubuntu自定义系统镜像和系统备份

    原链接 xff1a https community bwbot org topic 167 运行测试平台 小强ROS机器人 Systemback是一个Ubuntu系统中用于发布自定义系统镜像和系统备份的软件 有时候我们对自己的Ubuntu做
  • orangePi3 TLS tf卡分区、格式化、手动挂载和开机自动挂载

    orangePi3 TLS tf卡分区 格式化 手动挂载和开机自动挂载 适用于所有linux系统 TF卡新建分区 查看磁盘情况 fdisk l root 64 orangepi3 lts fdisk l Disk dev mmcblk0 5
  • 【PyQt】PyQt5开发环境搭建

    PyQt是基于python来开发Qt可视化窗口的简称 xff0c Qt本身是基于C 43 43 开发 xff0c 性能较好 xff0c Qt与Python结合后 xff0c 在Python的支持下可以快速地开发桌面应用程序 文章目录 1 P
  • 【C++】9.GIS应用:开源GIS平台开发入门(MapServer+QGIS+PostGIS+OpenLayers)

    GIS地理信息处理相关 文章目录 1 GIS软件工具2 MapServer服务器3 QGIS桌面软件QGIS加载csv数据 4 PostGIS数据库5 OpenLayers JS 浏览器客户端 1 GIS软件工具 在GIS数据处理时 xff
  • 【C++】6.网络编程:socket实现通信(文字、语音)

    常见的通信方式有文本 语音 xff0c 下面用C 43 43 实现 xff1a 参考 xff1a https blog csdn net Robot hfut article details 102862052 https blog csd