PostgreSQL客户端如何获取自身TCP端口号?含程序实现问询
获取PostgreSQL客户端本地端口的方法与问题
一、psql客户端的查询方式
如果以psql作为客户端,可执行以下查询语句获取本地端口:
SELECT * FROM pg_stat_activity WHERE application_name = 'psql';
查看返回结果中的client_port列即可确定本地端口。
二、C风格API客户端的端口获取问题
那么,拥有C风格API访问权限的任意客户端程序,该如何确定连接PostgreSQL服务器(默认端口5432)时使用的本地端口号?
从理论层面来说,该信息在本地Linux系统中必然存在,可通过底层连接句柄获取sockaddr,进而提取sin_port中的本地端口,但实际操作中遇到了困难,寻求相关实现提示。
三、实际需求背景
我的实际需求是无需调用PostgreSQL API即可监控客户端连接状态,提前预警因笔记本休眠等情况导致的连接中断。若能获取本地端口,可借助服务器端的identd(端口113)工具实现监控——该工具无状态的特性使其不受连接中断的影响。
这个问题源于有人反馈长期连接会因ISP更换家用IP而中断,此处暂不讨论公网运行PostgreSQL连接的合理性。我一直对Delphi、Lazarus这类RAD环境长期保持连接的做法不满,因此展开了这项研究。
四、更新进展
目前期望在程序内部实现端口获取,不调用外部工具。排查后发现前期尝试失败的原因:我使用的FPC/Lazarus(Delphi的开源克隆,虽不算流行但仍是实用的4GL开发环境)中,pg_conn结构体的定义已严重过时,需要自行修改以获取laddr字段,或直接对接libpq。
感谢目前收到的回复(尤其那些未否定该需求合理性的回复),后续我会反馈研究进展。
内容的提问来源于stack exchange,提问作者Mark Morgan Lloyd
相关产品推荐
相关产品推荐

