最近在学习 《Unix网络编程 卷1:套接字联网 API》。在编译其第一份代码 daytimetcpcli.c 的时候,发现作者使用到了 daytime 服务。比如下面这行代码:
servaddr.sin_port = htons(13); /* daytime server */
根据网上搜索相关信息得知,13 就是 xinet 内置的 daytime 服务的运行端口,其作用是,当有客户端请求 13 端口,daytime 服务则返回一串表示系统时间的字符串,比如:
25 JUN 2019 05:30:36 CST
因为我自己电脑上使用的是 Manjaro 系统(同 ArchLinux),因此在开启 xinetd daytime 服务上遇到了一些与其他系统(Ubuntu、Centos)不同的问题,比如说:
> 我安装完 xinetd 之后,在 /etc/xinetd.d
目录下根本就没有 daytime 文件。
接下来,我就把我解决这个问题的方法记录下来,以供网友们参考。
根据网上的教程,安装完 xinetd 之后,到 /etc/xinetd.d
文件夹下编辑下 daytime 文件内容,将 disable 设置为 no 即可。
但是,等我安装完之后,根本就没发现有 daytime 文件。
不过天无绝人之路,我在另一个虚拟机 Ubuntu 环境下安装了 xinetd,然后在 /etc/xinetd.d
中找到 daytime 文件,然后将其复制到 Manjaro 的对应韦志中,新建一个 daytime 文件,修改了下 disable 的值为 no,重启了下 xinetd 服务,竟然就成功了!
这里我说的有点快,我简单总结下步骤:
1. 安装 xinetd
$ sudo pacman -S xinetd
2. 编辑 daytime
$ cd /etc/xinetd.d
$ sudo vim daytime
粘贴以下内容:
# description: An internal xinetd service which gets the current system time
# then prints it out in a format like this: "Wed Nov 13 22:30:27 EST 2002".
# This is the tcp version.
service daytime
{
disable = no
type = INTERNAL
id = daytime-stream
socket_type = stream
protocol = tcp
user = root
wait = no
}
# This is the udp version.
service daytime
{
disable = no
type = INTERNAL
id = daytime-dgram
socket_type = dgram
protocol = udp
user = root
wait = yes
}
3. 重启 xinetd.service
$ systemctl enable xinetd.service
$ systemctl restart xinetd.service
可以通过下面这个命令来查看是否开启 xinetd 服务
$ systemctl list-unit-files
4. 验证 daytime 服务
这样,运行《Unix网络编程 卷1:套接字联网 API》的 daytimetcpcli.c 代码,即可看到运行结果:
$ ./daytimetcpcli 127.0.0.1
25 JUN 2019 05:30:36 CST
至此,这个问题算是解决了:)
希望这篇博客能够给你带来一些帮助。