linux基础编程:进程通信之套接字

Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程。通常我们使用socket进行网络编程,这里将会简单地讲述如何使用socket进行简单的网络编程。 一、什么是socket socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作 阅读详情

在文章《linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存》开头部分,我们介绍了linux环境下的进程通信方式IPC分类。本节我们将介绍由贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)提出的IPC工具:套接字接口。

套接字机制是管道概念的一个扩展。凭借这种机制,客户或者服务器系统的开发工作既可以在本地单机运行,也可以跨网络进行分布式进程间进行。但是套接字的创建和使用和管道是有区别的,它明确地将通信的两端应该分为客户端和服务端。

要使用套接字进行进程通信之间,首先必须使用系统调用socket,从系统中分配一个类似文件描述符的套接字描述符,下面我们首先来学习一下套接字描述符。


套接字描述符


套接字由三个属性来确定一个套接字的基本特性:域(domain),类型(type)和协议(protocol),并且利用套接字的地址作为套接字的名字,从而使得其他进程可以找到。


套接字域(domain)

和管道通信不同,套接字可以在基于本地文件系统,以及各种类型的互联网的环境下的进程间通信。因此需要通过一个参数指定套接字的在通信过程中使用的通信介质(互联网,本地文件系统等)。我们把这个参数称为域。 在linux文档中介绍了AF_UNIX/AF_LOCAL,AF_INET,AF_INET6 等10多种域。而其中以下面三种种最为常见:

  • AF_UNIX/AF_LOCAL:UNIX文件系统域,即以本地文件系统为通信介质。
  • AF_INET/AF_INET6:IPv4/IPv6互联网域,即以IPv4/IPv6为通信介质。

套接字类型(type)

套接字类型是指创建套接字的应用程序要使用的通信服务类型。主要有下面三种:流套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW)。

  • 流套接字(SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。
  • 数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
  • 原始套接字(SOCK_RAW):原始套接字相当于未定义规则的套接字,它的具体行为和它将要使用的套接字协议相关。

对于AF_UNIX/AF_LOCAL本地套接字来说,流套接字(SOCK_STREAM)相当于在本地进程之间建立起一条数据通道;数据报式套接字(SOCK_DGRAM)相当于单纯的发送消息,在进程通信过程中,理论上可能会有信息丢失、复制或者不按先后次序到达的情况,但由于其在本地通信,不通过外界网络,这些情况出现的概率很小。

对于AF_INET/AF_INET6互联网套接字来说,不同的套接字类型对应了不同的底层的网络协议。流套接字(SOCK_STREAM):网络套接字使用了传输控制协议,即TCP(The Transmission Control Protocol)协议,来保证实现可靠的数据服务。数据报套接字(SOCK_DGRAM):数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。原始套接字(SOCK_RAW):原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

另外,从linux2.6版本以后,还可以通过套接字类型来指定套接字的行为。通过上面三种和SOCK_NONBLOCK 进行OR操作,可以指定套接字为非阻塞套接字


套接字协议(protocol)

套接字协议来用来指定三种套接字类型所对应的底层通信协议。对于流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM),一般都只是使用默认值。即流套接字对应TCP/IP,数据报套接字对应UDP。当使用原始套接字时,可以使用特定的套接字协议来进行开发。

创建套接字描述符

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>

in
Linux进程通信 笔者在学习linux的过程中对linux进程通信进行记录学习。现在在 Linux 中使用较多的进程间通信方式主要有以下几种。 (1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信, 有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 (2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信 方式,用于通知接受进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求 效果上可以说是一样的。 (3)消息队列:消息 阅读详情

相关推荐

Linux网络编程 | 基本套接字(Socket)编程

网络中进程如何通信、Socket简介、socket套接字、套接字描述符、Socket基础API、创建socket、命名socket、监听socket、接受连接、发起连接、关闭连接、TCP数据读写、UDP数据读写、主机字节序和网络字节序、客户端 / 服务器模式及编程流程

ZY-JIMMY 2479

【并发编程四】windows进程通信和Linux进程通信

原本写完上一篇[【并发编程三】C++进程通信(管道pipe)],就准备写消息队列的c++demo了,但是真正查找资料才发现网上都是linux下的消息队列的c++demo,就没有windows下的消息队列的进程通信的demwindows没有信号这个概念,但是会提供类似功能的api,比如,杀死进程:linux下的kill信号,windows下提供TerminateProcess的api接口。

junxuezheng的博客 2559

进程间通信之套接字( socket )——完整代码

进程间通信之套接字( socket ) 网络间通信 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四.信号 ( sinal ) 五.消息队列 ( message queue ) 六.信号量 ( semophore ) 七.套接字 ( socket ) 以上七种进程间通信的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.youkuaiyun.com/user/qiulanzhu

2023-ICCV-隐式神经网络实现低光照图像增强(NeRCo)论文解读+代码解析

NeRCo()提出了一种名为NeRCo的隐式神经表示方法,用于合作式低光图像增强。现有的低光图像增强方法存在以下三个限制:不可预测的亮度降低和噪声、度量友好版本和视觉友好版本之间的固有差距,以及有限的配对训练数据。为了解决这些限制,论文提出了NeRCo方法,它以无监督的方式稳健地恢复感知友好的结果。具体而言,NeRCo通过一个可控的拟合函数统一了现实场景中多样的退化因素,从而提高了鲁棒性。对于输出结果,论文引入了来自预训练视觉-语言模型的先验信息,采用语义导向的监督方法。

weixin_45595504的博客 3184

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 551

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2186

IEC61850规约客户端软件开发实战(第六章)

IEC 61850标准中的GOOSE(Generic Object Oriented Substation Event,面向通用对象的变电站事件)功能是变电站自动化系统的核心通信机制,主要用于实现智能电子设备(IED)间高可靠性、低延时的实时信号传输。本章简述其核心功能与技术特点。

半青年的博客 1778

华为OD机试真题2025双机位A卷 Java&Go 实现【优美子数组】

华为OD机试真题2025双机位A卷 Java&Go 实现【优美子数组】

MISAYAONE的博客 239

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2236

【AI智能体】AI 编程 + 飞书CLI + Skills 重塑开发新范式实战操作详解

AI 编程 + 飞书CLI + Skills 重塑开发新范式实战操作详解

congge 3666

FPGA实现的AES加解密算法——Verilog源代码详解

本文将介绍基于FPGA的AES加解密算法的Verilog实现,并提供相应的源代码。根据密钥长度的不同,AES算法分为AES-128、AES-192和AES-256三种模式。对于已知的明文-密钥组合,可以使用在线的AES加解密工具计算出正确的密文,然后将该密文与FPGA加速器的输出进行比较。本文以AES-128算法为例,介绍基于FPGA的AES加解密算法的设计思路和Verilog实现。以上是基于FPGA的AES加解密算法的Verilog实现的相关内容。模块接受输入的明文和密钥,并输出加密后的密文。

HackSquad的博客 1976

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO
下一篇: linux基础编程:多线程基础总结:线程创建 终止 线程同步/互斥量/条件变量/信号灯
ColZer
博客等级 码龄14年 42粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值