zoukankan      html  css  js  c++  java
  • 对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索引页

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

  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/gaojian/p/2601309.html
Copyright © 2011-2022 走看看