对ListenSocket 的研究(五)

简介:

接前文 ListenSocket,进一步进行研究:


pqcomm.c 中的StreamServerPort函数中,增加如下代码:


复制代码

int                            

StreamServerPort(int family, char *hostName, unsigned short portNumber,  

                 char *unixSocketName,            

                 pgsocket ListenSocket[], int MaxListen)            

{                          

    /*added by gaojian begin*/         

    fprintf(stderr, "family is: %d.\n", family);                        

    fprintf(stderr, "hostName is : %s.\n", hostName);                        

    fprintf(stderr, "portNumber is:%d.\n", portNumber);                        

    fprintf(stderr, "unixSocketName is : %s.\n", unixSocketName);  

    /*added by gaojian end*/  

    ......


}

复制代码

启动服务器端后,运行的结果如下:


family : 0 

portNumber:

hostName: 192.168.66.133 

unixSocketName: null


 


family : 1

portNumber: 1

hostName: null

unixSocketName: null


ListenSocket[0]:3

ListenSocket[1]:4


可以看到,family 的0 和1 正好是 ListenSocket数组的下标。


而实际上,整个系统里面调用 StreamServerPort的也就是三个地方:


复制代码

if (strcmp(curhost, "*") == 0)                            

    status = StreamServerPort(AF_UNSPEC, NULL,                        

                  (unsigned short) PostPortNumber,            

                  UnixSocketDir,            

                  ListenSocket, MAXLISTEN);            

else                            

    status = StreamServerPort(AF_UNSPEC, curhost,                        

                  (unsigned short) PostPortNumber,            

                  UnixSocketDir,            

                  ListenSocket, MAXLISTEN);    

复制代码

...


复制代码

#ifdef HAVE_UNIX_SOCKETS                                        

    status = StreamServerPort(AF_UNIX, NULL,                                    

                              (unsigned short) PostPortNumber,            

                              UnixSocketDir,            

                              ListenSocket, MAXLISTEN);            

    if (status != STATUS_OK)                                    

        ereport(WARNING,                                

                (errmsg("could not create Unix-domain socket")));                        

#endif    

复制代码

而对StreamServerPort的调用,将最终变成对 getaddrinfo(通过pg_getaddrinfo_all)的调用。


可以说:


family 0 就是 AF_UNSPEC

family 1 就是 AF_UNIX (AF_UNIX的值也确实是 1)


可以这样认为,PostgreSQL在编译和运行阶段探测到系统有几种运行方式,就会准备几个用于网络通信的文件描述符。这些文件描述符构成了 ListenSocket 数组。


 





本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/20/2601309.html,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
安全 数据库连接 Linux
深入探索研究FileRun
【10月更文挑战第9天】
168 1
|
9月前
|
人工智能 UED
清华大学研究提出用大模型做心理测量
【2月更文挑战第24天】清华大学研究提出用大模型做心理测量
344 2
清华大学研究提出用大模型做心理测量
|
JSON 监控 安全
idor相关研究
前言 本文主要阐述了挖掘IDOR的主要流程,以及挖掘的一般性思路(主要从六个角度展开),更多的还要靠读者去实践。
215 0
idor相关研究
|
机器学习/深度学习 监控 算法
视频目标检测研究现状
目标检测算法从视频/图像信息中检测并定位特定目标,融合特征提取、图像处理、深度学习等技术。
540 0
|
SQL 存储 Go
AutoAudit研究学习
AutoAudit介绍   AutoAudit这个是Paul Nielsen写的一个开源的审计跟踪的脚本项目,项目位于https://autoaudit.codeplex.com/上,Paul Nielsen的一篇博客CodeGen to Create Fixed Audit Trail Triggers上也介绍了他创建这个项目的前因后果。
1326 0
神经影像学靶点研究取得进展
中国科学院自动化研究所面向脑科学与信息科学交叉前沿,发现了一组通用的多模态磁共振影像学靶点, 可实现精神分裂症多种认知能力的个体化预测,并成功在多中心验证推广,深入揭示了精神分裂症认知损伤所影响的多模态交互环路,为建立基于客观标记物的个体化治疗系统奠定基础。  
1589 0
自抗凝透析器研究取得系列进展
刘富研究员团队在膜微孔结构调控、膜表面抗凝分子修饰、自抗凝透析器方面取得系列进展,实现无肝素透析是血液透析发展趋势,为慢性肾病患者送来福音。
1779 0
|
缓存 Java
Java动态代理研究
浅说动态代理 关于java的代理模式,此处不过多讲解。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。动态代理指被代理者委托代理者完成相应的功能,是拦截器的一种实现方式,其用于拦截类或接口,内部可通过判断实现对某个方法的拦截。
896 0
|
SQL 关系型数据库 PostgreSQL