为什么我的getservbyname函数总是返回NULL?

时间:2013-01-25 05:45:37

标签: c linux sockets null mint

现在我在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函数来获取有关该问题的更多信息,但每次运行代码时我都能正常运行...

2 个答案:

答案 0 :(得分:2)

getservbyname()未设置errno,因此perror()不起作用。

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

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

答案 1 :(得分:0)

来自getservbyname手册页:

  

getservbyname()函数返回条目的servent结构   来自与服务名称匹配的数据库   协议原型。如果 proto 为NULL,则将匹配任何协议。

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

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

tcp udp 协议( echo )中有可用的服务,而其他服务只有其中一种( > ftp smtp )。 getservbyname函数查询/etc/services文件,搜索服务名称并返回包含 name 端口号等信息的结构协议别名

正如其他人已经指出的那样,您的代码存在的问题是该函数的 名称 参数不是服务器名称(例如 localhost < / em>或其他),但您正在寻找的服务名称(例如 ftp )。 proto 参数是可选的,当其值为NULL时,它与任何协议匹配。有效的协议是 tcp udp ,以防您对其中一个特别感兴趣。