【问题标题】:How can I know the service name?我怎么知道服务名称?
【发布时间】:2016-09-12 01:57:11
【问题描述】:

这段代码来自Stevens等人, Unix环境下的高级编程, 图16.17是一个服务器程序,提供系统uptime

#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,我不知道这个名称是从哪里来的。服务名称是否以该程序的名称命名?如何确定服务名称?我可以自己指定服务名称吗?

我没有复制initserverserve的代码,因为我认为它与问题无关。

【问题讨论】:

  • 我在同一本书中做同样的练习,我从getaddrinfo 收到一个错误,因为我认为ruptime 服务不存在。您是如何定义和创建此服务的?我在书中找不到有关创建此服务的任何参考资料:是吗?
  • @FrancescoBoi 看来您需要自己将该服务添加到/etc/service。我没有那样做。相反,我删除了一些代码并直接初始化服务器。

标签: sockets unix service ip-address systems-programming


【解决方案1】:

服务名称只是在/etc/services中查找的键;即它是对端口号的符号引用。

【讨论】:

  • 感谢您的回答,但让我困惑的是如何确定服务名称?我可以自己指定服务名称吗?
  • 正如 Gil 所说,服务名称存储在 services 文件中。您可以将所需的任何自定义条目添加到该文件。 getaddrinfo() 将检查 service 参数是否为数字,如果不是,则在文件中查找相应的条目。
  • Stevens 的客户端代码也使用“ruptime”而不是数字。如果我向服务器主机上的 /etc/services 添加一个条目,我还需要向所有客户端主机上的 /etc/services 文件添加相同的条目。我不会吗?
  • 正确。如果您使用该名称,它必须出现在每个执行代码的主机的本地 /etc/services 文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多