我怎么知道服务名称?
问题描述:
从史蒂文斯验证码等,UNIX环境高级编程,图16.17是一个服务器程序,提供系统正常运行时间我怎么知道服务名称?
#include "apue.h"
#include <netdb.h>
#include <errno.h>
#include <syslog.h>
#include <sys/socket.h>
#define BUFLEN 128
#define QLEN 10
#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 256
#endif
extern int initserver(int, const struct sockaddr *, socklen_t, int);
void
serve(int socked);
int
main(int argc, char *argv[])
{
struct addrinfo *ailist, *aip;
struct addrinfo hint;
int sockfd, err, n;
char *host;
if (argc != 1)
err_quit("usage: ruptimed");
if ((n = sysconf(_SC_HOST_NAME_MAX)) < 0)
n = HOST_NAME_MAX; /* best guess */
if ((host = malloc(n)) == NULL)
err_sys("malloc error");
if (gethostname(host, n) < 0)
err_sys("gethostname error");
daemonize("ruptimed");
memset(&hint, 0, sizeof(hint));
hint.ai_flags = AI_CANONNAME;
hint.ai_socktype = SOCK_STREAM;
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL;
if ((err = getaddrinfo(host, "ruptime", &hint, &ailist)) != 0) {
syslog(LOG_ERR, "ruptimed: getaddrinfo error: %s",
gai_strerror(err));
exit(1);
}
for (aip = ailist; aip != NULL; aip = aip->ai_next) {
if ((sockfd = initserver(SOCK_STREAM, aip->ai_addr,
aip->ai_addrlen, QLEN)) >= 0) {
serve(sockfd);
exit(0);
}
}
exit(1);
}
什么让我感到困惑的是函数调用的getaddrinfo,它只是告诉我服务名称是“ruptime”,我不知道这个名字来自哪里。这个程序的名称后面的服务名称名称?我如何确定服务名称?我可以自己指定服务名称吗?
我不重复initserver的代码和服务,因为我觉得它不涉及这个问题
答
服务名称是一个简单的键/etc/services
昂首。即它是对端口号的符号引用。
感谢您的回答,但令我困惑的是如何确定服务名称?我可以自己指定服务名称吗? – Sherwin
像Gil说的那样,服务名称存储在['services'](http://man7.org/linux/man-pages/man5/services.5.html)文件中。您可以将所需的任何自定义条目添加到该文件。 'getaddrinfo()'将检查'service'参数是否为数字,如果不是,则查找文件中的相应条目。 –
Stevens的客户端代码也使用“ruptime”而不是数字。如果向服务器主机上的/ etc/services添加条目,则还需要将相同的条目添加到所有客户端主机上的/ etc/services文件中。我不会吗? –