概述
#define UNIX_PATH_MAX 108
struct sockaddr_un
{
__kernel_sa_family_t sun_family; /* 通信协议 AF_UNIX / AF_LOCAL */
char sun_path[UNIX_PATH_MAX]; /* pathname */
//UNIX 域协议的地址,是以'\0'结束的本地文件系统中的绝对路径名
//会自动的创建不需要提前创建
};
UNIX 域协议之进程间通信方式一:socketpair 函数
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
/*socketpair1.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
int main ()
{
int sv[2];
int result = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
if (result < 0){
exit(1);
}
printf("sv[0] is : %d \n", sv[0]); //这两个套节字句柄并不相同,但作用是一样的
printf("sv[1] is : %d \n", sv[1]);
if (fork())
{
/* 父进程 */
int val = 0;
pid_t pid = getpid();
close(sv[1]); //父进程关闭 sv[1]的读写权限
while (1)
{
++val;
printf("%d send message: %d\n", pid, val);
write(sv[0], &val, sizeof(val)); //父进程向管道里写数据
//也可以去读
// read(sv[0], &val, sizeof(val)); //如果字进程不写数据,将会导致此处堵塞
//printf("%d receive message: %d\n", pid, val);
sleep(1);
}
}
else
{
/*子进程*/
int val = 0;
close(sv[0]); //字进程关闭 sv[0]的读写权限
pid_t pid = getpid();
while(1)
{
read(sv[1], &val, sizeof(val)); //字进程从管道中取数据
printf("%d receive message: %d\n", pid, val);
// printf("%d receive message: %d\n", pid, val);
//也可以写
// write(sv[1], &val, sizeof(val));
}
}
}
UNIX 域协议之进程间通信方式二:套接字通信方式
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define UNIX_PATH_PS "/home/china/sockp1" //连接的套接字地址
#define UNIX_PATH_PC "/home/china/sockp2" //绑定的套接字地址
int main(int argc,char *argv[])
{
system("rm /home/china/sockp2"); //防止文件重名
//1.创建一个套接字
int sockfd = socket(AF_UNIX, SOCK_STREAM,0); //创建一个本地通信 UNIX 流式套接字
if(-1 == sockfd)
{
perror("create socket failed");
exit(-1);
}
//2.绑定一个通信地址(让服务器能看到我),可不绑定
struct sockaddr_un local;
memset(&local,0,sizeof(struct sockaddr_un)); //清空结构体
local.sun_family = AF_UNIX;
strcpy(local.sun_path,UNIX_PATH_PC);
int ret = bind(sockfd,(struct sockaddr*)&local,sizeof(local));
if(ret == -1)
{
perror("bind error");
exit(-1);
}
printf("bind success\n");
//连接目标服务器
struct sockaddr_un saddr; //保存目标服务器的地址(本地的文件名)
memset(&saddr,0,sizeof(struct sockaddr_un)); //清空结构体
saddr.sun_family = AF_UNIX;
strcpy(saddr.sun_path,UNIX_PATH_PS);
ret = connect(sockfd, (struct sockaddr*)&saddr,sizeof(saddr)); //请求连接目标服务器
if(ret == -1)
{
perror("connect error");
exit(-1);
}
printf("connect success\n");
char buf[1024] = {0};
//读取信息
ret = recv(sockfd,buf,1024, 0);
if(ret == -1)
{
perror("recv error");
}
printf("recv size:%d,recv data:%s\n",ret,buf);
//发送信息
ret = sendto(sockfd,"byebye",6,0,NULL,0);
if(ret == -1)
{
perror("sendto error");
}
printf("sendto size:%d\n",ret);
//关闭套接字
shutdown(sockfd,SHUT_RDWR);
close(sockfd);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define UNIX_PATH_PS "/home/china/sockp1"
int main(int argc,char *argv[])
{
system("rm /home/china/sockp1"); //保证该文件没有被使用
//1.创建一个套接字
int sockfd = socket(AF_UNIX, SOCK_STREAM,0); //创建一个本地通信UNIX 流式套接字
if(-1 == sockfd)
{
perror("create socket failed");
exit(-1);
}
//2.绑定一个通信地址(作为服务器本身的地址)
struct sockaddr_un local; //保存服务器的地址(文件名)
memset(&local,0,sizeof(struct sockaddr_un)); //清空结构体
local.sun_family = AF_UNIX;
strcpy(local.sun_path,UNIX_PATH_PS);
int ret = bind(sockfd,(struct sockaddr*)&local,sizeof(local)); //绑定服务器的地址
if(ret == -1)
{
perror("bind error");
exit(-1);
}
printf("bind success\n");
//3.开启对一个套接字的监听
listen(sockfd,250);
//4.等待客户端的连接
while(1)
{
struct sockaddr_un caddr; //保存客户端的地址(文件名)
socklen_t len = sizeof(caddr);
int confd = accept(sockfd,(struct sockaddr*)&caddr,&len); //阻塞等待客户端连接
if(confd > 0) //客户端连接成功,返回一个连接套接字专门用来和客户端通信
{
//一个客户端连接成功.开一个进程/线程去处理这个连接
printf("client path:%s\n",caddr.sun_path);
ret = sendto(confd,"nishiliangzaima?",20,0,NULL,0); //发送消息
if(ret == -1)
{
perror("sendto error");
}
char buf[1024] = {0};
ret = read(confd,buf,1024); //接收消息
if(ret <= 0)
{
perror("recv error");
}
printf("recv size:%d,recv data:%s\n",ret,buf);
close(confd);//关闭连接套接字
}
}
//关闭套接字
shutdown(sockfd,SHUT_RDWR);
close(sockfd);
return 0;
}
文章来源地址https://www.toymoban.com/news/detail-719183.html
文章来源:https://www.toymoban.com/news/detail-719183.html
到了这里,关于UNIX 域协议(本地通信协议)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!