【问题标题】:Why my getservbyname function always return NULL?为什么我的 getservbyname 函数总是返回 NULL?
【发布时间】:2013-01-09 01:52:04
【问题描述】:

现在我在使用 linux mint 中的 getservbyname() 函数时遇到了一些问题,每次我尝试获取端口时,它都会返回 NULL,我不知道会是什么

   extern struct servent *get_port(char *name, char *prot) {
      struct servent *tmp;
      tmp = getservbyname(name, prot);
      if(tmp == NULL) {
        return NULL;
      }
      return tmp;
    }

这就是我调用函数的方式

    struct servent *port;

    if((port = (struct servent*)get_port("server", "tcp")) == NULL){
        perror("Error... \n");
        return -1;
    }
    printf("Got the port... \n");

我使用 perror 函数来获取有关该问题的更多信息,但是每次运行代码时,我都会发现该函数正常工作...

【问题讨论】:

  • 那么您查找的知名服务的名称是“server”?有趣的。我必须在我的 /etc/services 文件中查找它。不知道它的存在(因此在“知名”面前有些飞扬)。编辑:我的服务文件中有 8000 多个条目,与名为“服务器”的服务无关。这真的是您要查找的名称吗?

标签: c linux sockets null linux-mint


【解决方案1】:

getservbyname() 没有设置errno,所以perror() 不起作用。

如果返回NULL那么最可能的原因是你指定的服务在services文件中不存在,或者services文件打不开。

您示例中的名称 "server" 不是服务数据库中通常包含的名称 - 尝试查找像 "ftp" 这样的服务。

【讨论】:

  • 另请注意,虽然getservbyname 在传递正确的服务名称时应该可以工作,但它已被getaddrinfo 淘汰。
【解决方案2】:

来自getservbyname 手册页:

getservbyname() 函数返回条目的服务结构 从与服务 name 匹配的数据库中使用 协议原型。如果 proto 为 NULL,则将匹配任何协议。

/etc/services 文件具有以下结构:

echo        7/tcp
echo        7/udp
ftp         21/tcp
smtp        25/tcp     

tcpudp 协议 (echo) 中提供了一些服务,而其他服务仅在其中一个中可用 (ftpsmtp)。 getservbyname 函数查询 /etc/services 文件以搜索服务名称并返回包含诸如 name端口号协议等信息的结构> 和别名

正如其他人已经指出的那样,您的代码的问题是函数的 name 参数不是服务器名称(例如 localhost 或其他),但您要查找的服务名称(例如,ftp)。 proto 参数是可选的,当它的值为 NULL 时,它匹配任何协议。有效的协议是 tcpudp,以防您对其中之一特别感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2011-12-08
    • 2017-09-24
    • 2020-06-17
    • 2014-09-12
    • 2019-09-18
    • 2014-09-02
    相关资源
    最近更新 更多