任何人都知道服务器使用xinetd需要做哪些更改?
服务器是在Linux上运行的.NET邮件服务器。
请参阅本文的底部以供参考: Lumisoft Mailserver Forum Post
注意:xinetd,而不是单一服务。 [x] inetd是一个互联网超级服务器。
超级服务器按需启动服务器服务。
(与连续运行的服务器服务相反,这是单服务所做的)
答案 0 :(得分:7)
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。)
答案 1 :(得分:1)
对于需要接收数据并与用户进行某种程度交互的应用程序,inetd服务非常适用。通过将来自(x)inetd的套接字数据管道传输到std {in,out,err},IT可以在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
以包含您的应用,如下所示:
myapp port#/ proto
并将您的应用添加到/etc/inetd.conf
(或xinetd.d),如下所示:
myapp stream tcp6 nowait myappuser / path / to / myapp myapp -arg_flags