Linux环境下socket本地通信

最近项目有用到了socket本地通信,故复习一下。之前都是基于本地虚拟机的ip地址通信的,现在项目,Linux单板上面有2个进程需要通信,故用到了本地socket通信,主要其实就是用了sockfd,文件描述符,也叫句柄。

服务端代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>/* 本地通信——基于socket文件进行数据传递 */#define SOCK_FILE "my.sock"	 // 定义存储的socket文件名int main(int argc,char *argv[])
{printf("1. 服务器 创建socket套接字...\n");int sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);	// UDP协议if( sockfd == -1){perror("socket");return -1;}printf("2. socket套接字关联到socket文件...\n");struct sockaddr_un addr;	// 本地通信地址类型addr.sun_family = AF_LOCAL;	// 地址簇strcpy(addr.sun_path, SOCK_FILE);// 绑定到物理内存,创建套接字文件int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));if (ret != 0 ) {perror("bind");return -1;}printf("3. 服务器循环接收数据...\n");while (1) {char buf[1024] = {};ssize_t rb = read(sockfd, buf, sizeof(buf));if (rb == -1) {perror("read");return -1;}// 当客户端发送"!quit"关闭时,即结束循环if(rb == 0 || strcmp(buf,"!quit")==0)break;printf("receive: %s\n",buf);}printf("4. 服务器读取数据完毕,关闭服务器...\n");close(sockfd);printf("5. 删除套接字文件!\n");unlink(SOCK_FILE);return 0;
}

客户端代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>#define SOCK_FILE "my.sock"	// 定义存储的socket文件名int main(int argc,char *argv[])
{printf("1. 客户端创建套接字...\n");int sockfd = -1;sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);if (sockfd == -1) {perror("socket");return -1;}printf("2. 客户端连接到服务器socket通信地址...\n");struct sockaddr_un addr;addr.sun_family = AF_LOCAL;strcpy(addr.sun_path, SOCK_FILE);// 请求连接,让socket套接字连接到服务器的通信地址int ret = connect(sockfd,(const struct sockaddr*)&addr,sizeof(addr));if (ret != 0) {perror("connect");return -1;}printf("3. 客户端循环发送数据...\n");while (1) {printf("请输入:");char buf[1024] = {};fgets(buf, 1024, stdin);// 将获取到的换行符替换成'\0'int len = strlen(buf);if (buf[len-1] == '\n') {--len;buf[len] = '\0';}int ret = 0;// 发送数据if ((ret = write(sockfd, buf, len + 1) ) < 0) {perror("write");return -1;}if (ret = 0 || strcmp(buf, "!quit") == 0)break;}printf("4. 关闭客户端...\n");close(sockfd);return 0;
}

运行结果如下:

server端

client端

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

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

相关文章

自动化测试:PO模式详解!

PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 概括来说就是&#xff0c;每个页面都有对应的PO类&#xff0c;PO类中包含了页面的元素定位和操作方法。…

Spring JDBC和事务管理

Spring JDBC是Spring框架用来处理关系型数据库的模块&#xff0c;对JDBC的API进行了封装。 Spring JDBC的核心类为JdbcTemplate&#xff0c;提供数据CRUD方法 Spring JDBC使用步骤 Maven工程引入依赖spring-jdbc <dependency><groupId>org.springframework<…

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组&#xff08;形状&#xff09;ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度&#xff08;字节&#xff09;ndarray.dtype数组元素的类型使用方法 数组名.…

数组越界死循环

目录 一、数组越界死循环 二、strcpy函数 三、memcpy函数 四、memmove函数 五、memcmp函数 六、memset函数​ 一、数组越界死循环 数组越界死循环问题&#xff08;详细&#xff0c;通俗&#xff0c;易懂&#xff09;_数组加i死循环-CSDN博客https://blog.csdn.net/weixin…

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

JVM虚拟机系统性学习-运行时数据区(堆)

运行时数据区 JVM 由三部分组成&#xff1a;类加载系统、运行时数据区、执行引擎 下边讲一下运行时数据区中的构成 根据线程的使用情况分为两类&#xff1a; 线程独享&#xff08;此区域不需要垃圾回收&#xff09; 虚拟机栈、本地方法栈、程序计数器 线程共享&#xff08;数…

kali linux无法使用root打开vlc观看视频的解决办法

kali linux陆续装了几个视频播放器&#xff0c;都比较不够友好&#xff0c;无奈安装vlc,vlc安装方法就是 apt install vlc这个没什么好说的&#xff0c;多数源都集成这个著名软件了&#xff0c;kali linux打开闪退&#xff0c;终端下运行出现&#xff1a; VLC is not supposed…

DDD领域驱动设计系列-原理篇-战略设计

概述 DDD领域驱动设计是架构方法论&#xff0c;适用于业务逻辑较复杂系统。 DDD核心目的能输出领域如何划分&#xff0c;以及架构分层如何构建。 本文章系列会分2部分讲述DDD&#xff1a;1、DDD原理&#xff1b;2、DDD实践。DDD原理分为战略及战术设计2篇来讲述&#xff1b;…

Realme X7 Pro Root 刷机教程

Realme X7 Pro 刷机教程 Just For Fun&#xff0c;最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程&#xff0c;如有机友跟随本教程操作&#xff0c;请谨慎操作&#xff01;&#xff01;&#xff01; 以下教程真针对Realme X7 Pro&#xff0c;其他版本方法未知&…

无人机巡山护林,林业无人机智能助力绿色守护

随着全球环保意识的不断提高&#xff0c;无人机巡山护林已经成为解决森林巡检难题的一种独特而高效的方式。在我国&#xff0c;各地正积极探索无人机在森林防火、病虫害监测以及生态调查等领域的创新应用。随着无人机技术的不断演进&#xff0c;其在推动森林保护和可持续发展方…

每日一博 - 图解5种Cache策略

文章目录 概述读策略Cache AsideRead Through 写策略Write ThroughWrite AroundWrite Back 使用场景举例 概述 缓存是在系统中存储数据的临时存储器&#xff0c;用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据 读策略 Read data from the system: &#x1f5…