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索引页

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

  • 相关阅读:
    Linq101-Generation
    Linq101-Element
    解决 oracle 错误ORA-01033
    Oracle数据表恢复
    C++构造函数
    C++类与对象
    CMake命令之export
    CMake命令之install
    CMake变量(提供信息的变量)
    CMake常用变量
  • 原文地址:https://www.cnblogs.com/gaojian/p/2601309.html
Copyright © 2011-2022 走看看