接前文 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 数组。
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/20/2601309.html,如需转载请自行联系原作者