【发布时间】: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,我不知道这个名称是从哪里来的。服务名称是否以该程序的名称命名?如何确定服务名称?我可以自己指定服务名称吗?
我没有复制initserver和serve的代码,因为我认为它与问题无关。
【问题讨论】:
-
我在同一本书中做同样的练习,我从
getaddrinfo收到一个错误,因为我认为ruptime服务不存在。您是如何定义和创建此服务的?我在书中找不到有关创建此服务的任何参考资料:是吗? -
@FrancescoBoi 看来您需要自己将该服务添加到
/etc/service。我没有那样做。相反,我删除了一些代码并直接初始化服务器。
标签: sockets unix service ip-address systems-programming