nginx源码学习Unix - Unix域协议

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

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

 

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

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

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

socket地址结构:

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

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

服务器端:

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;}

客户端:

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就可以使用到了

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

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.mzph.cn/news/294213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle12c考试内容,12c ocp考试内容

oca1z0-047(Oracle Database SQL Expert 1Z0-047) 60个题&#xff0c;90分钟&#xff0c;66%过关。/1z0-051(Oracle Database 11g: SQL Fundamentals I 1Z0-051) 64个题&#xff0c;120分钟&#xff0c;60%过关。/1z0-061(Oracle Database 12c: SQL Fundamentals 1Z0-061) 75个…

微软开源的Web测试和自动化神器 Playwright

Playwright 是微软开源的一个用于 Web 测试和自动化的框架, 提供了可靠的端到端测试, 功能非常强大, 可以在测试, 爬虫&#xff0c;自动化场景中使用。跨浏览器Playwright 支持所有现代的渲染引擎&#xff0c;包括 Chromium、WebKit 和 Firefox。跨平台在 Windows, Linux 和 ma…

史上最厉害的“1+2”!这个270年前出现的大难题,已经60多年没有出现好消息了..........

全世界只有3.14 % 的人关注了爆炸吧知识费马费马欧拉欧拉数学是科学的皇后数论是数学中的皇冠这顶皇冠每一次被举起它的光芒都在照亮数学的前方从112到“12”人类一次次逼近“哥德巴赫猜想”的真相从一张白纸到上面写满n>2的证明“费马大定理”凝聚成了一部数学史从2、3、5、…

放寒假的硕博研究生将经历什么?

全世界只有3.14 % 的人关注了爆炸吧知识1月中下旬基本全国的高校都放假了&#xff0c;除了部分因为疫情滞留在学校和外地的学生&#xff0c;绝大多数的学生都会回家过年。平时自带学霸光环&#xff0c;可以借口工作学业繁忙&#xff0c;不回家&#xff0c;不用应酬&#xff0c;…

自动化测试有感

1、 研究自动化测试也有一段时间了&#xff0c;从不熟悉到慢慢的了解&#xff0c;从不会到会&#xff0c;从迷茫到清晰...... 前段时间一直都很疑惑&#xff0c;为什么要自动化&#xff0c;自动化能给我们带来哪些好处&#xff1f;它存在的价值在哪里&#xff1f;运行一个脚本…

iOS 集合的深复制与浅复制

2019独角兽企业重金招聘Python工程师标准>>> 概念 对象拷贝有两种方式&#xff1a;浅复制和深复制。顾名思义&#xff0c;浅复制&#xff0c;并不拷贝对象本身&#xff0c;仅仅是拷贝指向对象的指针&#xff1b;深复制是直接拷贝整个对象内存到另一块内存中。 一图以…

Adb安装程序出现TimeOut错误

为什么80%的码农都做不了架构师&#xff1f;>>> 安装Apk过程中&#xff0c;出现如下错误&#xff1a; Failed to install on device ‘XXX′: timeout 原因时设备速度太卡&#xff0c;导致启动超时&#xff0c;解决办法&#xff1a;延长超时时间。 方法&#xff…

2021.NET大会日程首发!行程亮点全曝光!

{倒计时4天文末有福利→.NET机器人定制抱枕}2021年12月18日由中国各地技术社区共同发起举办、知名企业和开源组织联合协办的2021年中国.NET开发者大会即将盛大开幕▽2020/12/18-12/19主题&#xff1a;开源共建|开放创新|开发赋能形式&#xff1a;线上直播- 长按二维码免费领票 …

继Science发文后,Nature也发文评论曹雪涛“误用图片”调查结果

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术2021年1月26日傍晚 Nature 网站以头条新闻的方式刊出了题为“著名中国免疫学家没有剽窃和学术造假”的新闻并配以曹雪涛的照片&#xff0c;该新闻大篇幅报道了科技部等多部门对于中国工程院院士曹雪涛的联合…

linux运行.pak文件,使用game-to-flatpak脚本将商业Linux游戏安装程序转换为Flatpak应用程序...

现在有一个新的脚本&#xff0c;它允许你将各种商业Linux游戏的安装程序转换成可以在各种GNU/Linux发行版上运行的Flatpak软件包。这是一个开源的shell脚本&#xff0c;由GNOME开发人员Bastien Nocera开发&#xff0c;它做了一件事&#xff0c;即自动将各种格式的商业Linux游戏…

Log4j 2漏洞(CVE-2021-44228)的快速响应

简介2021 年 12 月 9 日&#xff0c;在Log4j的 GitHub 上公开披露了一个影响多个版本的 Apache Log4j 2 实用程序的高严重性漏洞 CVE-2021-44228、CVSSv3 10.0 (https://logging.apache.org/log4j/2.x) 。该漏洞由阿里云安全团队的陈兆军&#xff08;可能为音译&#xff09;发现…

Xcode4.5编译ffmpeg成功,过程说明

最近项目要用音视频的通话&#xff0c;需要用ffmpeg来实现&#xff0c;但是ffmpeg在iOS平台上的编译有些问题。 1 下载代码 1.下载ffmpeg源代码 git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 参考&#xff1a;http://ffmpeg.org/download.html 2.下载ffmpeg-iphone…

box2d 绘制圆

在让刚体听我的——ApplyForce、ApplyImpulse、SetLinearVelocity一节中&#xff0c;来自天地会的sxl001问道如何创建圆形的边界(Round Boundary)&#xff0c;好吧&#xff0c;我用这个教程来回答他。 实际上Box2D中没有专门创建圆弧的API (b2CircleDef创建的是实体圆形不是圆弧…

深入剖析Android系统

深入剖析Android系统&#xff08;基于Google发布的Jelly Bean原始代码&#xff0c;讲述Android系统的内部静态结构关系和内部运行机制&#xff0c;为你呈现原汁原味的Android代码分析大餐&#xff01;&#xff09; 杨长刚著 ISBN 978-7-121-19374-3 2013年1月出版 定价&#xf…

微博上的网红,为什么更能红得发紫?

“网红”是最近非常热潮的互联网现象。在微博上&#xff0c;各种各样的网红不仅活跃了粉丝群体&#xff08;微博月活跃用户增至2.61亿&#xff09;&#xff0c;也为微博增添了互动热度&#xff08;微博一季度微博日均视频播放量达4.7亿次&#xff0c;同比增长489%&#xff0c;比…

TotoiseSVN-小乌龟的使用方法总结

原文转自 http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html 收藏起来用的时候比较方便 TotoiseSVN的基本使用方法在 项目管理实践教程一、工欲善其事&#xff0c;必先利其器【Basic Tools】中&#xff0c;我已经讲解了怎样安装TortoiseSVN。在上面的讲解中已经…

WPF DataGrid 如何将被选中行带到视野中

WPF DataGrid 如何将被选中行带到视野中目录前言准备工作方法一方法二总结独立观察员 2021 年 12 月 11 日前言在 WPF 开发中&#xff0c;显示表格一般使用 DataGrid 控件&#xff0c;而且我们一般会依据用户的选中行的操作来执行一些逻辑&#xff0c;这种情况&#xff0c;选中…