【问题标题】:service to port number like getaddrinfo服务到端口号,如 getaddrinfo
【发布时间】:2015-01-12 22:21:18
【问题描述】:

在 C 中,你可以在使用 getaddrinfo 时使用服务名来获取端口号,如下所示:

getaddrinfo("stackoverflow.com", "http", &hints, &results);

这会将 80(大端序)分配给 results->ai_addr 的前两个字节 (uint16_t)。

有没有一些简单的方法可以从 ?only 获取端口号?给出服务名称?我在服务器端需要这个,我希望允许用户为要绑定和监听的端口指定端口号或服务名称。

【问题讨论】:

  • grep -w http /etc/services?
  • @alk 这是个好主意,但是有一些标准的 C 函数吗?
  • 不,还有getaddrinfo() 不是标准C。
  • 您想让服务器如何监听“服务名称”,顺便说一句?
  • @alk 你是对的,但它来自一个相当常见的 linux 库,用于处理套接字。有什么可比的吗?

标签: c service port getaddrinfo


【解决方案1】:

使用getaddrinfo 和一个空指针作为主机名和标志中的AI_PASSIVE 会给你一个sockaddr,你可以绑定它来运行服务器。请参阅getaddrinfo 的文档:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html

【讨论】:

    【解决方案2】:

    man getservbyname

      #include \netdb.h>
       struct servent *getservent(void);
       struct servent *getservbyname(const char *name, const char *proto);
       struct servent *getservbyport(int port, const char *proto);
    

    【讨论】:

    • 仍然是 POSIX,但是 1+。
    • @alk 请注意,我从未在问题中说它必须来自标准 C 库。事实上,我提到了标准 C 库中没有的 getaddrinfo。当我在评论中说一些标准的 C 函数时,我的意思更像是在一个常用的 C 函数/库中,这几乎是使用的标准,但我感到困惑。
    • 这是过时的/不推荐使用的并且非线程安全的。正确的方式是getaddrinfo
    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多