给定一个端口,返回Golang中相应的服务(例如http、ssh等)

给定一个端口,返回Golang中相应的服务(例如http、ssh等),go,dns,port,Go,Dns,Port,我在围棋中玩net软件包。虽然我看到了许多有用的Lookup*函数,但它们似乎都不会返回给定端口使用的服务 例如(这纯粹是虚构的): 我发现这实际上可以在具有dns.lookupService的节点中实现,其中提供的回调实际上是一个服务。围棋中也可能有类似的东西吗?我发现相反的情况是,给定服务和网络(例如tcp、udp),它返回端口,但我想要的是相反的情况。我希望这是有意义的。查看包netdbat 包netdb为procent和servent提供了一个Go接口 netdb.h中定义的结构 通过解

我在围棋中玩
net
软件包。虽然我看到了许多有用的Lookup*函数,但它们似乎都不会返回给定端口使用的服务

例如(这纯粹是虚构的):


我发现这实际上可以在具有
dns.lookupService
的节点中实现,其中提供的回调实际上是一个服务。围棋中也可能有类似的东西吗?我发现相反的情况是,给定服务和网络(例如tcp、udp),它返回端口,但我想要的是相反的情况。我希望这是有意义的。

查看包
netdb
at

包netdb为procent和servent提供了一个Go接口 netdb.h中定义的结构

通过解析/etc/protocols和 /etc/服务

具体来说:

func GetServByPort

func GetServByPort(端口int,协议*Protoent)*Servent

GetServByPort返回给定端口号的Servent,并 协议如果协议为nil,则匹配端口的第一个服务 返回数字


知道节点的dns.lookupService实际上在做什么吗?因为您所描述的并不是一件真正的事情——任何东西都可以在任何端口上运行,并且没有通用的方法来识别它们。服务查找(例如
net.Resolver
中的
LookupSRV
)返回一个端口,但是,SRV记录不支持AFAIK反向查找。似乎它们正在使用os
getnameinfo
,并且能够返回一个
服务
,然后将其传递到回调。我知道Go可能使用相同的底层
getnameinfo
C函数,但我无法找到它们是如何从中提取服务的节点中的端口号。如果我有主机名和端口来返回服务,这会更有意义吗?您可以通过创建一组与服务文件内容匹配的常量来实现相同的功能,这些常量仅来自IANA端口注册。只是要知道,这并不意味着有任何东西正在该端口上侦听,或者如果有什么东西在侦听,那么它可能是IANA分配给该端口的服务,也可能不是。@Adrian“因为你所描述的不是真正的东西”,它绝对是。Unix系统有一个
/etc/services
文件,该文件将端口号映射到IANA注册的服务名称。libc具有在您有另一个数据时请求一个数据的函数。看到了吗?哦,很好,我会马上处理它,看看它是否如预期的那样工作。非常感谢。只是一个快速更新,这绝对是我要找的!查看
etc/services
文件并提取映射端口->服务是完美的。它目前不起作用,因为我总是得到一个nil
Servent
,但这绝对是有帮助的!谢谢你,我今天学到了一些新东西!上一次更新,这实际上和我想要的完全一样!似乎有一个小错误,但我即将提交一份公关。太棒了,再次谢谢你!
service, err := net.LookUpService(23)
// service is ssh