任何人都知道服务器与 xinetd 一起工作需要进行哪些更改?
该服务器是在 Linux 上运行的 .NET 邮件服务器。
请参阅这篇文章的底部以供参考: Lumisoft Mailserver 论坛帖子
注意:xinetd,不是mono-service。[x]inetd 是一个互联网超级服务器。
超级服务器按需启动服务器服务。
(与持续运行的服务器服务相反,这就是 mono-service 所做的)
任何人都知道服务器与 xinetd 一起工作需要进行哪些更改?
该服务器是在 Linux 上运行的 .NET 邮件服务器。
请参阅这篇文章的底部以供参考: Lumisoft Mailserver 论坛帖子
注意:xinetd,不是mono-service。[x]inetd 是一个互联网超级服务器。
超级服务器按需启动服务器服务。
(与持续运行的服务器服务相反,这就是 mono-service 所做的)
inetd 服务的运行方式与独立服务器不同。inetd 服务读取标准输入并写入标准输出,让 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 sockets/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
以包含您的应用程序,如下所示:myapp port#/proto
并将您的应用程序添加到/etc/inetd.conf
(或 xinetd.d),如下所示: myapp stream tcp6 nowait myappuser /path/to/myapp myapp -arg_flags