nginx源码学习Unix - Unix域协议

简介:

    说到什么是域协议就会出现这么个解释:

    UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所使用的API相同。UNIX域协议可以视为IPC方法之一。

     

    我们白话解释下Unix域协议在什么情况下使用和怎么使用?

    Unix域协议主要用在同一台机子的不同进程之间传递套接字。为什么不用TCP或者UDP套接字呢?一是因为快。源自Berkeley的实现中,Unix域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍。二是因为安全。Unix套接字能提供额外的安全检查措施。

    注意:Unix域协议表示协议地址的是路径名,而不是Inet域的IP地址和端口号

    socket地址结构:

    1
    2
    3
    4
    5
    #include<sys/un.h>
    struct sockaddr_un {
         sa_family_t sun_family; /*AF_LOCAL*/
         char  sun_path[ 104 ];     /*null-terminated pathname*/
    };

    至于他们的程序和TCPsocket没有什么区别

    服务器端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Unix_Domain_ser.c                                                                                                                                                                           
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/un.h>
    #include <sys/select.h>
     
    int  main( int  argc, char  *argv[])
    {
         int  listenfd1;
         struct sockaddr_un serv_addr1;
         //这里使用的AF_LOCAL代表是Unix域协议
         listenfd1 = socket(AF_LOCAL, SOCK_STREAM, 0 );
         
         bzero(&serv_addr1, sizeof(struct sockaddr_un));
         serv_addr1.sun_family = AF_LOCAL;
         strncpy(serv_addr1.sun_path, argv[ 1 ], sizeof(serv_addr1.sun_path)- 1 );
     
         bind(listenfd1, (struct sockaddr *)&serv_addr1, SUN_LEN(&serv_addr1));
         listen(listenfd1, 5 );
        
         int  clifd;
         char  buffer[ 256 ];
         //如果是listenfd1 获取消息
         clifd = accept(listenfd1, NULL, NULL);
         
         bzero(buffer, 256 );
         read(clifd, buffer, 255 );
         printf( "Listenfd1 Message is:%s\r\n" , buffer);
         
         close(listenfd1);
         return  0 ;
     
    }

    客户端:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Unix_Domain_cli.c                                                                                                                                                                           
     
    #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/un.h>
     
    int  main( int  argc, char * argv[])
    {
         int  socketfd, n;
         socketfd = socket(AF_LOCAL, SOCK_STREAM, 0 );
         
         struct sockaddr_un serv_addr;
         
         bzero(( char  *)&serv_addr, sizeof(serv_addr));
         serv_addr.sun_family = AF_LOCAL;
         strncpy(serv_addr.sun_path, argv[ 1 ], sizeof(struct sockaddr_un));
         
         connect(socketfd,(struct sockaddr *)  &serv_addr, SUN_LEN(&serv_addr));
         
         write(socketfd, "client message" , 14 );
         return  0 ;
     
    }

    服务端命令:

    clip_image001

    客户端命令:

    clip_image002

    参考文档:

    http://memorymyann.iteye.com/blog/649619

    http://hi.baidu.com/wangjianzhong1981/blog/item/d91d1c1073b2e409203f2e4d.html

    socketpair函数

    #include <sys/socket.h>

    int socketpair(int family, int type, int protocol, int sockfd[2]);

    1 socketpair创建两个socket,并连接起来,只用于Unix域

    2 family参数必须为AF_LOCAL,protocol参数必须为0,

    socketpair函数主要用在什么地方呢?当父进程fork出一个子进程的时候,两个进程需要使用Unix套接字进行进程间通信,那么socketpair就可以使用到了

    发现说什么还是不如写代码实在:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Unix_Domain_Sockpair.c                                                                                                                                                                      
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/un.h>
     
    int  main( int  argc, char  *argv[])
    {
         int  sockets[ 2 ];
         char  buffer[ 1024 ];
     
         socketpair(AF_LOCAL, SOCK_STREAM, 0 , sockets);
     
         int  child;
         child = fork();
         if (child) { //父进程
             close(sockets[ 0 ]);
             read(sockets[ 1 ], buffer, 255 );
             printf( "parent read--> %s\r\n" , buffer);
             close(sockets[ 1 ]);
         } else  //子进程
             close(sockets[ 1 ]);
             write(sockets[ 0 ], "Message" , sizeof( "Message" ));
             printf( "child write--> Message\r\n" );
             close(sockets[ 0 ]);
         }  
         return  0 ;
     
    }

    执行程序:

    clip_image003

    nginx中的socketpair使用:

    在nginx_process.c中你会看到这个:

    clip_image004

    这里得到几个信息:

    1 Solaris 9 没有AF_LOCAL这个属性,所以使用AF_UNIX属性来代替

    2 nginx每个worker进程之间都有channel通道,通道就是使用socketpair创建的


    本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2012/06/08/2541401.html,如需转载请自行联系原作者


相关文章
|
2月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
130 7
|
3月前
|
缓存 负载均衡 应用服务中间件
Nginx 学习
【10月更文挑战第17天】Nginx 是一款非常强大的工具,掌握它的使用和配置对于构建高性能、可靠的 Web 应用至关重要。随着技术的不断发展,Nginx 也在不断更新和完善,为我们提供更好的服务和支持。
|
3月前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
194 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
3月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
3月前
|
Kubernetes 监控 测试技术
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
141 2
k8s学习--基于Ingress-nginx实现灰度发布系统
|
3月前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
149 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
7月前
|
应用服务中间件 Linux nginx
杨老师课堂之Nginx学习之安装篇
杨老师课堂之Nginx学习之安装篇
42 0
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
423 0
|
8月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
4月前
|
负载均衡 网络协议 应用服务中间件
web群集--rocky9.2源码部署nginx1.24的详细过程
Nginx 是一款由 Igor Sysoev 开发的开源高性能 HTTP 服务器和反向代理服务器,自 2004 年发布以来,以其高效、稳定和灵活的特点迅速成为许多网站和应用的首选。本文详细介绍了 Nginx 的核心概念、工作原理及常见使用场景,涵盖高并发处理、反向代理、负载均衡、低内存占用等特点,并提供了安装配置教程,适合开发者参考学习。