【socket】 unix域套接字(socketpair )通信|socketpair和pipe的区别|进程间通信-Unix domain socket

article/2025/9/22 11:43:20

 

目录

unix域套接字(socketpair )通信|socketpair和pipe的区别

socketpair机制

描述

原理

socketpair和pipe的区别

进程间通信-Unix domain socket


unix域套接字(socketpair )通信|socketpair和pipe的区别

2020-12-25 10:13:34

socketpair机制

描述

先看下传统的CS模型,如下:

总是一方发起请求,等待另一方回应。当一次传输完成之后,client端发起新的请求之后,server端才作出回应。 那如何才能做到双向通信?  一种解决办法就是client端即使client,又是server,server端即使client也是server,如下:

但是上述方面比较复杂,这时候就引入要分析的socketpair了。

socketpair用于创建一对相互连接的unnamed socket。而pipe系统调用使用创建的pipe也是相互连接的unnamed pipe(无名管道)。而pipe和socketpair创建的描述符之间的区别就是:  pipe创建的描述符一端只能用于读,一端用于写,而socketpair创建的描述符任意一端既可以读也可以写。

原理

示例代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>#define SOCKET_BUFFER_SIZE      (32768U)void *thread_function(void *arg)
{int len = 0;int fd  = *((int*)(arg));char buf[500];int cnt = 0;/*主线程*/while(1){        /*向main thread线程发送数据*/len = sprintf(buf, "Hi, main process, cnt = %d", cnt++);write(fd, buf, len);/*读数据*/len = read(fd, buf, 500);buf[len]='\0';printf("%s\n",buf);sleep(5);    } return NULL;
}int main()
{int ret;int sockets[2];int bufferSize = SOCKET_BUFFER_SIZE;pthread_t thread;ret = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);if(ret == -1){printf("socketpair create error!\n");return -1;}/*设置socket描述符的选项*/setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));/*创建线程1*/pthread_create(&thread, NULL, thread_function, (void*)(&sockets[1]));int len = 0;int fd  = sockets[0];char buf[500];int cnt = 0;/*主线程*/while(1){/*读数据*/len = read(fd, buf, 500);buf[len]='\0';printf("%s\n",buf);/*项thread线程发送数据*/len = sprintf(buf, "Hi, thread process, cnt = %d", cnt++);write(fd, buf, len);}return 0;
}

测试结果:

1.  编译代码

gcc socketpair.c -o socketpair -lpthread


2. 运行,查看结果

test$ ./socketpairHi, main process, cnt = 0Hi, thread process, cnt = 0Hi, main process, cnt = 1Hi, thread process, cnt = 1Hi, main process, cnt = 2Hi, thread process, cnt = 2

注意:  socketpair创建的只适用于父子进程或者线程间通信,不能用于两个进程之间通信。如果要实现两个进程之间的双向通信,则需要将socketpair创建的一个描述符fd发送给另一个进程,这相当于两个两个不同的进程访问同一个文件。

socketpair和pipe的区别

(原文:进程通信:管道(pipe)和socketpair区别_funpig的博客-CSDN博客_socketpair和pipe)

管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工。

socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写。

详间代码:

一:pipe实现父子进程全双工通信:

#include <stdlib.h>
#include <stdio.h>int main ()
{int fd1[2],fd2[2];pipe(fd1);pipe(fd2);if ( fork() ) {/* Parent process: echo client */int val = 0;close( fd1[0] );close(fd2[1]);while ( 1 ) {sleep( 1 );++val;printf( "parent Sending data: %d\n", val );write( fd1[1], &val, sizeof(val) );read( fd2[0], &val, sizeof(val) );printf( "parent Data received: %d\n", val );}}else {/* Child process: echo server */int val ;close( fd1[1] );close(fd2[0]);while ( 1 ) {read( fd1[0], &val, sizeof(val) );printf( "son Data received: %d\n", val );++val;write( fd2[1], &val, sizeof(val) );printf( "son send received: %d\n", val );}}
}

输出结果:parent Sending data: 1 
son Data received: 1 
son send received: 2 
parent Data received: 2 
parent Sending data: 3 
son Data received: 3 
son send received: 4 

parent Data received: 4

一:soketpair实现父子进程全双工通信:

#include <sys/types.h>
#include <sys/socket.h>#include <stdlib.h>
#include <stdio.h>int main ()
{int fd[2];int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );if ( r < 0 ) {perror( "socketpair()" );exit( 1 );}   if ( fork() ) {/* Parent process: echo client */int val = 0;close( fd[1] );while ( 1 ) {sleep( 1 );++val;printf( "parent Sending data: %d\n", val );write( fd[0], &val, sizeof(val) );read( fd[0], &val, sizeof(val) );printf( "parent Data received: %d\n", val );}}else {/* Child process: echo server */int val ;close( fd[0] );while ( 1 ) {read( fd[1], &val, sizeof(val) );printf( "son Data received: %d\n", val );++val;write( fd[1], &val, sizeof(val) );printf( "son send received: %d\n", val );}}
}

输出结果:parent Sending data: 1 
son Data received: 1 
son send received: 2 
parent Data received: 2 
parent Sending data: 3 
son Data received: 3 
son send received: 4 

parent Data received: 4

更多使用实例:《socketpair的用法和理解》socketpair的用法和理解_JohnWill_的博客-CSDN博客_socketpair

进程间通信-Unix domain socket

2020-04-24 19:24:09

 socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。

虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。

这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

  UNIX Domain Socket是全双工的,API接口语义丰富,相比其它IPC机制有明显的优越性,目前已成为使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。

  使用UNIX Domain Socket的过程和网络socket十分相似,也要先调用socket()创建一个socket文件描述符,address family指定为AF_UNIX,type可以选择SOCK_DGRAM或SOCK_STREAM,protocol参数仍然指定为0即可。

  UNIX Domain Socket与网络socket编程最明显的不同在于地址格式不同用结构体sockaddr_un表示,网络编程的socket地址是IP地址加端口号,而UNIX Domain Socket的地址是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已存在,则bind()错误返回。

Unix domain socket和TCP/IP之间有两个重要的不同。

1、socket的地址是文件路径,而不是一个包含ip和端口的元组。

2、在文件系统创建的代表socket的文件在socket关闭后依然存在,并且需要在每次服务器启动时删除。


server.py

import socket
import sys
import osSERVER_PATH = './uds_socket'# Make sure the socket does not already exist
if os.path.exists(SERVER_PATH):os.remove(SERVER_PATH)
print >>sys.stderr ,'starting unix domain socket server'# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Bind the socket to the port
sock.bind(SERVER_PATH)
# Listen for incoming conns
sock.listen(2)
print >>sys.stderr, 'Listening on path: %s' % SERVER_PATHwhile True:conn, addr = sock.accept()try:while True:data = conn.recv(1024)if data:print >>sys.stderr, 'received [%s]' % dataconn.sendall(data)else:breakexcept Exception,e:print efinally:conn.close()

client.py

import socket
import sys# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = './uds_socket'
print >>sys.stderr, 'connecting to %s' % server_address
try:sock.connect(server_address)
except socket.error, msg:print >>sys.stderr, msgsys.exit(1)try:# Send datamessage = 'This is the message, This will be echoed back'print >>sys.stderr, 'sending [%s]' % messagesock.sendall(message)amount_received = 0amount_expected = len(message)while amount_received < amount_expected:data = sock.recv(1024)amount_received += len(data)print >>sys.stderr, 'received [%s]' % datafinally:print >>sys.stderr, 'closing socket'sock.close()

参考文章:https://www.jianshu.com/p/394dd8448400

Socket 用于进程间通信 --- UNIX Domain Socket - chekliang - 博客园


http://chatgpt.dhexx.cn/article/O3DrqSCa.shtml

相关文章

Android framework socketpair

简述 在Linux中&#xff0c;socketpair函数可以用于创建一对相互连接的、通信域为AF_UNIX的套接字&#xff0c;其中一个套接字可用于读取&#xff0c;另一个套接字可用于写入。可以使用这对套接字在同一进程内进行进程间通信&#xff08;IPC&#xff09;。 以下是使用socketp…

socketpair的理解

参考博客链接&#xff1a; https://blog.51cto.com/liulixiaoyao/533469 socketpair创建了一对无名的套接字描述符&#xff08;只能在AF_UNIX域中使用&#xff09;&#xff0c;描述符存储于一个二元数组eg. s[2] 这对套接字可以进行双工通信&#xff0c;每一个描述符既可以读也…

android socket双向,Android中socketpair双向通信详解

Android很多地方会涉及到进程间的通信&#xff0c;比如输入系统&#xff0c;那么进程间通信会涉及哪些内容呢&#xff1f; 1、进程&#xff1a;负责读取和分发事件 2、应用程序&#xff1a;负责处理输入事件 上面这两个进程会涉及哪些双向通信呢&#xff1a; 1.进程会发送输入事…

Linux下socketpair系统API调用使用说明

目录 1.socketpair函数说明 2.socketpair使用举例 在阅读nginx源码时&#xff0c;发现其调用socketpair来实现master和worker进程之间进行数据交互。其代码如下&#xff1a; 思考&#xff1a;master和worker进程是父子关系&#xff0c;有亲属关系的进程通过pipe/pipe2&#x…

socketpair函数介绍及使用

摘要 在linux下&#xff0c;使用socketpair函数能够创建一对套节字进行进程间通信&#xff08;IPC&#xff09;。 函数原形&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socketpair(int domain, int type, int protocol, int sv[2]); 参数…

socketpair机制

描述 先看下传统的CS模型&#xff0c;如下: 总是一方发起请求&#xff0c;等待另一方回应。当一次传输完成之后&#xff0c;client端发起新的请求之后&#xff0c;server端才作出回应。 那如何才能做到双向通信&#xff1f; 一种解决办法就是client端即使client&#xff0c;又…

【socketpair函数介绍及使用】

socketpair函数介绍及使用 函数原型进程间通信线程间通信 Linux环境下使用socketpair函数创造一对未命名的、相互连接的UNIX域套接字。   管道历史上&#xff0c;它们是半双工的&#xff08;数据只能在一个方向上流动&#xff09;&#xff0c;但是现在也有全双工管道。管道只…

LAMP架构超详细搭建步骤

LAMP介绍&#xff1a; LinuxApacheMysql/MariaDBPerl/PHP/Python一组常用来搭建或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大的Web应用程序平台。 目前LA…

LAMP架构介绍

转载自&#xff1a; https://blog.csdn.net/aoli_shuai/article/details/78745984 https://blog.csdn.net/sj349781478/article/details/84224440 一、LAMP介绍&#xff1a; LAMP是 linux Apache MySQL PHP的简写&#xff0c;即把Apache MySQL PHP 安装在linux系统上&#xff…

Lamp架构部署phpmadmin项目

Lamp架构部署phpmadmin项目 文章目录 Lamp架构部署phpmadmin项目官网下载phpmadmin的包测试登陆 官网下载phpmadmin的包 [phpMyAdmin]: 将下载好的包拖入目录里&#xff0c;并解压 [rootlocalhost ~]# cd /usr/src/ [rootlocalhost src]# lsapr-1.6.5 apr-1.6.5.tar.gz a…

【笔记】lamp架构框图

一、lamp架构 (1)、lamp基础结构 (2)、分布式lamp架构 (3)、实际运用 二、OSI七层和TCP/IP五层关系 这部分具体可以参考网址 (1)、OSI七层 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互联。 一般都叫OSI参考模型&#xff0c;是ISO&…

LAMP服务架构

LAMP服务架构 文章目录 LAMP服务架构1. LAMP简介2. LAMP工作原理3. 部署LAMP3.1 源码安装http服务3.2 源码安装mysql数据库3.3 源码安装php3.2 apache和php配置 1. LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写 L代表服务器操作系统使用…

LAMP架构部署论坛

搭建论坛&#xff0c;要求为8080端口 安装LAMP 架构所需的服务&#xff0c;部分及插件 yum -y install mariadb mariadb-server mariadb-libs php php-mysql php-gd php-fpm php-cli gd httpd 启动服务&#xff1a;systemctl start httpd mariadb 设置数据库密码&#xff1a…

快速搭建LAMP架构

快速搭建LAMP架构 1.安装apache2.部署mysql3.部署php结合apache4.验证5.部署一个论坛disuz 1.安装apache [rootlocalhost ~]# yum install httpd -y 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* …

LAMP架构简介与配置

文章目录 前言LAMP 简介与概述LAMP平台概述 构建LAMP平台顺序编译安装的优点各组件的主要作用 编译安装 Apache编译安装mysql安装PHP 前言 LAMP 简介与概述 LAMP平台概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#x…

搭建LAMP架构

搭建LAMP架构 一、LAMP架构概述 1、LAMP简介 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#xff0c;能够提供动态web站点服务及其应用开发环境。 LAMP是一个缩写词&#xff0c;具体包括Linux操作系统&#xff0c;Apache网…

LAMP架构简介与概述 及服务安装

目录 1、LAMP平台概述 &#xff08;1&#xff09;LAMP平台概述 &#xff08;2&#xff09;构建LAMP平台顺序 &#xff08;3&#xff09;编译安装的优点 &#xff08;4&#xff09;各组件的主要作用 2、Apache概述 &#xff08;1&#xff09; 安装Apache服务&#xff1a;…

什么是LAMP架构?

LAMP架构介绍 LAMP动态网站架构 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。 1、LAMP分别代表什么&#xff1f; L代表服务器操作系统使用Linux A代表网站服务使用的是Apache软件基金会中的httpd软件 M代表网站后台使用的数据库是MySQL数…

【ubuntu】搭建lamp架构

文章目录 一、准备工作1、更新源2、更新软件3、防火墙UFW 二、安装apache21、安装apache包2、网页浏览查看 三、安装mysql1、安装mysql2、查看mysql3、设置mysql数据库的密码 四、安装PHP1、安装php包以及插件2、测试php包 五、安装wordpress1、获取wordpress的压缩包2、上传压…

腾讯云— LAMP 架构个人实践分享

LAMP 环境通常指Linux 环境下&#xff0c;由ApacheMySQL/MariaDBPHP 以及其它相关组件组成的网站服务器架构。目前以LAMP组成的Web 应用程序平台广泛被应用&#xff0c;70%以上的访问流量由LAMP提供&#xff0c;所以我们也认同LAMP是最强大的网站解决方案。 关于LAMP的环境部署…