2016-05-16 104 views
0

从史蒂文斯验证码等,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的代码和服务,因为我觉得它不涉及这个问题

回答

2

服务名称是一个简单的键/etc/services昂首。即它是对端口号的符号引用。

+0

感谢您的回答,但令我困惑的是如何确定服务名称?我可以自己指定服务名称吗? – Sherwin

+1

像Gil说的那样,服务名称存储在['services'](http://man7.org/linux/man-pages/man5/services.5.html)文件中。您可以将所需的任何自定义条目添加到该文件。 'getaddrinfo()'将检查'service'参数是否为数字,如果不是,则查找文件中的相应条目。 –

+0

Stevens的客户端代码也使用“ruptime”而不是数字。如果向服务器主机上的/ etc/services添加条目,则还需要将相同的条目添加到所有客户端主机上的/ etc/services文件中。我不会吗? –