现在我在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函数来获取有关该问题的更多信息,但每次运行代码时我都能正常运行...
答案 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 ,以防您对其中一个特别感兴趣。