linuxIPC--UNIX域套接字

2023-12-12 04:08
文章标签 unix 接字 域套 linuxipc

本文主要是介绍linuxIPC--UNIX域套接字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/todd911/article/details/20285711

1.非命名的UNIX域套接字

UNIX套接字用于在同一台机器上运行的进程之间通信。UNIX套接字比因特网域套接字的效率更高。UNIX域套接字提供和数据报两种接口,UNIX域数据报服务是可靠的,就不会丢失消息也不会传递出错。UNIX域套接字是套接字和管道之间的混合物。

为了创建一对非命名的,相互连接的UNXI域套接字,用户可以使用socketopair函数。

#include<sys/socket.h>
int socketpair(int domain, int type, int protocol, int sockfd[2]); //若成功则返回0,出错则返回-1.

实践:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>int main(void){int fd[2];int pid;char wbuf[16] = "1234567890";char rbuf[16] = "\0";if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0){perror("socketpair");return -1;}if((pid = fork())<0){perror("fork");return -1;}else if(pid == 0){//childclose(fd[0]);if(write(fd[1],wbuf,strlen(wbuf)) < 0){perror("write");exit(-1);}}else{//parentclose(fd[1]);if(read(fd[0],rbuf,16) < 0){perror("read");exit(-1);}printf("%s\n",rbuf);}return 0;
}

执行结果:

yan@yan-vm:~$ ./a.out
1234567890

2.命名UNIX域套接字

虽然socketpair函数创建相互连接的一对套接字,但是每一个套接字都没有名字。这意味着无关进程不能使用它们。

我们可以命名unix域套接字,并可将其用于告示服务。但是要注意的是,UNXI域套接字使用的地址不同与因特网域套接字。

UNIX域套接字的地址由sockaddr_un结构表示。

在linux2.4.22中,sockaddr_un结构按下列形式定义在有文件<sys/un.h>中。

struct sockaddr_un{

sa_family_t sun_family; //AF_UNIX

char sun_path[108]; //pathname

};

sun_path成员包含一路经名,当我们将一个地址绑定至UNIX域套接字时,系统用该路经名创建一类型为S_IFSOCK文件。

该文件仅用于向客户进程告知套接字名字。该文件不能打开,也不能由应用程序用于通信。

如果当我们试图绑定地址时,该文件已经存在,那么bind请求失败。当关闭套接字时,并不自动删除该文件,所以我们必须

确保在应用程序终止前,对该文件执行解除链接操作。

服务器进程可以使用标准bind、listen和accept函数,为客户进程安排一个唯一UNIX域连接。客户进程使用connect与服务器

进程连接;服务器进程接受了connect请求后,在服务器进程和客户进程之间就存在了唯一连接。这种风格和因特网套接字

的操作很像。

实践:

server.c

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>int main(void){int fd,clientfd;int client_addr_len = sizeof(struct sockaddr_un);struct sockaddr_un un,clientun;char path[32]="serversocketfile";int addr_len = sizeof(struct sockaddr_un);char rbuf[32];char wbuf[32] = "i am server.";//create a UNIX domain stream socketif((fd = socket(AF_UNIX,SOCK_STREAM,0)) < 0){perror("socket");return -1;}//in case it already existsunlink(path);//fill in socket address structurememset(&un, 0, sizeof(un));un.sun_family = AF_UNIX;strncpy(un.sun_path,path,32);//bind the name to the descriptorif(bind(fd, (struct sockaddr*)&un, addr_len) < 0){perror("bind");return -1;}if(listen(fd, 10) < 0){perror("listen");return -1;}if((clientfd = accept(fd,(struct sockaddr*)&clientun,(socklen_t*)&client_addr_len)) < 0 ){perror("accept");return -1;}printf("client is:%s\n",clientun.sun_path);if(read(clientfd,rbuf,32) < 0){perror("read");return -1;}printf("receive msg:%s\n",rbuf);if(write(clientfd,wbuf,strlen(wbuf)+1) < 0){perror("write");return -1;}unlink(path);return 0;
}

client.c
#include <stdio.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <string.h>int main(void){int fd;struct sockaddr_un un;char path[32] = "clientsocketfile";char serverpath[32] = "serversocketfile";int addr_len = sizeof(struct sockaddr_un);char wbuf[32] = "i am client.";char rbuf[32];if((fd = socket(AF_UNIX,SOCK_STREAM,0))<0){perror("socket");return -1;}memset(&un,0,sizeof(un));un.sun_family = AF_UNIX;strncpy(un.sun_path,path,32);unlink(path);if(bind(fd,(struct sockaddr*)&un,addr_len)<0){perror("bind");return -1;}//fill socket adress structure with server's addressmemset(&un,0,sizeof(un));un.sun_family = AF_UNIX;strncpy(un.sun_path,serverpath,32);if(connect(fd,(struct sockaddr*)&un,addr_len) < 0){perror("connect");return -1;}if(write(fd,wbuf,strlen(wbuf)+1)<0){perror("write");return -1;}if(read(fd,rbuf,32) < 0){perror("write");return -1;}printf("receive msg:%s\n",rbuf);unlink(path);return -1;
}

先运行server,再运行client。

运行结果:

server.c:

yan@yan-vm:~/apue$ ./unixserver
client is:clientsocketfile
receive msg:i am client.

client.c:

yan@yan-vm:~/apue$ ./unixclient
receive msg:i am server.

这篇关于linuxIPC--UNIX域套接字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483182

相关文章

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

【unix高级编程系列】线程

引言 我们知道unix进程中可以有多个线程,进程中的线程可以访问该进程的所有组成部分。并且CPU的调度单元就是线程。这就面临一个问题:当进程中的临界资源需要在多个线程中共享时,如何解决一致性问题? 本文将从线程的概念、线程的使用方式、unix提供哪些方式解决一致性问题进行介绍,加深对线程的理解。 线程概念 线程的优点: 简化代码结构。比如在业务上为每种事件类型分配单独的处理线程,可以

微软C#套接字异步通信代码

Asynchronous Server Socket Example.NET Framework 4 其他版本 The following example program creates a server that receives connection requests from clients. The server is built with an asynchronous socket,

套接字的介绍

套接字(Socket)是计算机网络中用于实现不同主机之间通信的一种抽象概念。它提供了一种标准的接口,使得应用程序能够通过网络发送和接收数据。以下是关于套接字的详细介绍: 1. 套接字的基本概念 定义:套接字是一种用于网络通信的端点,通常由 IP 地址和端口号组成。它允许不同的程序进行网络通信。类型: 流套接字(TCP Socket):使用传输控制协议(TCP),提供可靠的、面向连接的通信。数据

JAVAEE初阶第六节——网络编程套接字

系列文章目录 JAVAEE初阶第六节——网络编程套接字 文章目录 系列文章目录JAVAEE初阶第六节——网络编程套接字 一. 网络编程基础1. 为什么需要网络编程2. 什么是网络编程3.网络编程中的基本概念 3.1 发送端和接收端 3.2 请求和响应 3.3 客户端和服务端 4. 常见的客户端服务端模型 5. TCP和UDP特点上的差别(初识) 二.Socket套接字 1. 概

linux的nohup命令的用法。在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local

在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –user=mysql &。可是有很多程序并不想mysqld一样,这样我们就需要nohup命令,怎样使用nohup命令呢?这里讲解nohup命令的一些用法。 nohup /root/

CocoaAsyncSocket 套接字

https://github.com/robbiehanson/CocoaAsyncSocket   Asynchronous socket networking library for Mac and iOS 用于iOS以及Mac的异步套接字网络库。   TCP GCDAsyncSocket and AsyncSocket are TCP/IP socket networking l

【Unix编程】进程间通信(IPC)

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 1、特点: 它是半双工

Unix与Linux的关系

Unix 和 Linux 之间有着密切的历史和技术联系,尽管它们是两个独立的操作系统。 Unix 的历史 Unix 的历史可以追溯到1969年,当时 AT&T 的贝尔实验室的工程师肯·汤普逊(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)开始开发 Unix 操作系统。Unix 设计之初是为了方便进行程序开发工作,它强调的是多用户、多任务的能力,以及良好的文件系统支持。

【docker无法启动】 can't create unix socket /var/run/docker.sock: is a directory

一次重启docker后出现的问题 Oct 18 19:18:20 worker systemd[1]: Starting Docker Application Container Engine...Oct 18 19:18:20 worker1 dockerd-current[118257]: time="2018-10-18T19:18:20.734668371+08:00" level=w