任何人都知道服务器需要进行哪些更改才能与 xinetd 一起工作?
服务器是在 Linux 上运行的 .NET 邮件服务器。
参考这篇文章的底部: Lumisoft Mailserver 论坛帖子
注意:xinetd,不是单一服务。 [x]inetd 是一个互联网超级服务器。
超级服务器按需启动服务器服务。
(与持续运行的服务器服务相反,这是单一服务所做的)
inetd 服务与独立服务器的运行方式不同。 inetd 服务读取 stdin 并写入 stdout,让 inetd 处理 TCP/IP 的细节,而不是跟踪它们自己的套接字。如果你想让服务器在 inetd 下运行,它也必须这样做。
以下程序在我机器上的 xinetd 下运行得很好:
#include <iostream>
#include <string>
using namespace std; // yeah, i'm lazy.
int main()
{
string name;
cout << "What's your name? " << flush;
cin >> name;
cout << "Hi, " << name << "!" << endl;
}
注意我一点也不担心套接字——xinetd 安排了一些事情,以便服务可以读取标准输入并写入标准输出。在大多数情况下,您只需像在控制台上运行它一样编写您的应用程序。套接字详细信息在服务的配置文件中指定。 (请注意,您可能能够使用 stdin/stdout 获取/设置有关套接字的详细信息,这可能是实际的套接字——我不确定——但你真的应该把这些东西留给 inetd。)
inetd 服务非常适合需要接收数据并与用户进行某种程度交互的一次性应用程序。 IT 通过将数据从套接字从 (x)inetd 传输到 std{in,out,err} 来在 tcp/udp 上工作。 inetd 应用程序还可以与 tcpwrappers 配合使用,以通过系统策略文件和 ACL 增强安全性。
所以是的,你会像控制台应用程序一样编写你的应用程序,因为实际上它是一个控制台应用程序。只需将 inetd 视为从网络到应用程序输入的透明反向代理。
忠告,编写代码以正确处理进程信号,如果您需要与系统上的另一个进程交互,请使用 unix 套接字/fifo。
此外,不要尝试编写一次传输大量数据或需要大量连接的应用程序。可伸缩性是一个问题,因为 inetd 成为瓶颈,这就是为什么 Apache 和 Sendmail 放弃了对 inetd 的支持,而是作为单一应用程序运行。 HTTP 更适合这个角色,而带有 nginx 的 fastcgi(或插入最喜欢的框架)脚本最适合该用例。
inetd 的一个很好的例子是:
lock = Mutex.new
trap :HUP { #log the connection and cleanup }
trap :USR1 { lock.synchronize do #stuff; end }
trap :TERM { #clean up }
trap :KILL { #clean up and die with error codes }
puts "App name - version"
loop do
('%s> ' % Console.prompt).display
input = gets.chomp
command, *params = input.split /\s/
case command
when /\Ahelp\z/i
puts App.help_text
when /\Ado\z/i
Action.perform *params
when /\Aquit\z/i
exit
else
puts 'Invalid command'
end
end
exit
编辑您的
/etc/services
以包含您的应用程序,如下所示:
我的应用程序端口#/proto
并将您的应用程序添加到
/etc/inetd.conf
(或 xinetd.d),如下所示:
myapp stream tcp6 nowait myappuser /path/to/myapp myapp -arg_flags
至于 xinetd,每个配置都有自己的类似 c 的语法,并且根据发行版的不同,可以使用
/etc/xinetd.conf
或 /etc/xinetd.d/myapp.conf
。建议阅读联机帮助页:https://linux.die.net/man/5/xinetd.conf
一个示例配置说
in-cpio.conf
看起来像:
service ftp
{
socket_type = stream
wait = no
user = nobody
server = /usr/bin/cpio
server_args = -idv
instances = 1
nice = 10
only_from = 127.0.0.1
}