对ListenSocket 的研究(五)

磨砺技术珠矶,践行数据之道,追求卓越价值  

回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页

[作者:高健@博客园 luckyjackgao@gmail.com]

 

接前文 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: 0 
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 数组。

 

[作者:高健@博客园 luckyjackgao@gmail.com]

回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页

磨砺技术珠矶,践行数据之道,追求卓越价值  

posted @ 2012-07-20 16:11  健哥的数据花园  阅读(727)  评论(0编辑  收藏  举报