对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索引页
磨砺技术珠矶,践行数据之道,追求卓越价值