PostgreSQL 客户端如何确定自己的 TCP 端口号是什么?

问题描述 投票:0回答:1

如果运行例如psql 作为客户端,可以使用类似的查询

SELECT * FROM pg_stat_activity WHERE application_name = 'psql';

通过检查返回结果中的client_port列来确定本地端口。

可以访问 C 风格 API 等的任意客户端程序如何确定用于连接到服务器端口的本地端口号(默认为 5432)?

此信息必须在本地某个地方可用,因为除了操作系统(在我的例子中为 Linux)所知的其他信息之外。我本来期望有一些相对简单的方法来使用低级连接句柄来获取 sockaddr,从而获取 sin_port 中的本地端口号...但是我正在努力解决实用性问题,并且会很感激任何提示。

我实际上想做的是在不接触 Postgres API 的情况下监视客户端连接状态,这样如果连接被中断,我可以收到提前警告。由于笔记本电脑进入睡眠状态而超时。如果我知道本地端口号,那么我可以在服务器上使用类似 identd(端口 113)设施的东西,因为这是无状态的,所以应该不会受到连接中断的影响。

这是由其他地方的某人抱怨他的 ISP 更改他的国内 IP 地址而中断了长期运行的连接而引发的。抛开对通过互联网运行 Postgres 连接之类的智慧的所有考虑,我认为这是一个值得研究的问题,因为我长期以来对某些 RAD 环境(例如 Delphi 和 Lazarus)保持连接开放的做法不满意无限期。

更新:我希望能够将其保留在程序中,并且绝对不需要调用一系列外部实用程序;然而,在研究如何最好地表达这一点时,我想我已经发现了我之前的尝试失败的原因。我使用的是 FPC/Lazarus,它是 Delphi 的开源克隆(虽然它绝对“不流行”,但仍然是有能力的开发环境,在 20 世纪 90 年代我们称之为“4GL”)。事实证明,他们对 pg_conn 结构(等价物)的定义已经严重过时了,我需要一起破解一个固定的等价物,以便我可以获取 laddr 字段和/或直接调查与 libpq 的接口。

感谢您迄今为止的回复(并且感谢您不仅告诉我我正在尝试做一些毫无意义或不受欢迎的事情),但请把这个留给我,一旦我了解更多,我会报告(但它不会)不是今天)。

postgresql networking client
1个回答
1
投票

您可以使用套接字统计实用程序来过滤和显示已建立的 TCP 连接,其中源端口与 PostgreSQL 端口匹配。

ss -o state established '( sport = :postgresql )'

ss -t -a 'sport = :5432' | awk '$1 == "ESTAB" {print}'

检查该特定端口上的所有实例。

© www.soinside.com 2019 - 2024. All rights reserved.