1

现在我getservbyname()在linux mint中遇到了一些问题,每次我尝试获取一个端口它都会返回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 函数来获取有关该问题的更多信息,但是每次运行代码时,我都会发现该函数正常工作...

4

2 回答 2

2

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

如果返回NULL,则最可能的原因是您指定的服务在服务文件中不存在,或者服务文件无法打开。

您示例"server"中的名称不是通常包含在服务数据库中的名称 - 尝试查找类似"ftp".

于 2013-01-25T06:02:41.777 回答
0

getservbyname手册页:

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

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

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

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

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

于 2014-11-26T21:53:56.073 回答