2010-08-18 17 views

cevap

8

bir inetd hizmeti tek başına bir sunucudan farklı çalışır (ne mono-hizmettir sürekli çalışan sunucu hizmeti, aksine). inetd servisleri stdin'i okur ve stdout'a yazarak, kendi soketlerini takip etmekten ziyade TCP/IP'nin gory ayrıntılarını ele alır. Bir sunucuyu inetd altında çalıştırmak istiyorsanız, aynı şeyi yapmak zorunda kalacaksınız.

aşağıdaki program benim makinede Xinetd altında sadece iyi çalışır: i yuva hakkında hiç endişeli değilim

#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; 
} 

Not - hizmet standart girdiden okur ve standart yazabilir böylece Xinetd şeyleri düzenler çıktı. Uygulamanızı, çoğu zaman konsolda çalıştırıyormuş gibi yazıyorsunuz. Soket ayrıntıları servisin yapılandırma dosyasında belirtilmiştir. (Not, gerçek soket olabilir stdin/stdout kullanarak soket hakkında ayrıntıları almak/ayarlamak mümkün olabilir - emin değilim - ama gerçekten bu şeyler inetd kadar bırakmalısınız.)

+0

Herhangi bir örnek var mı, C++ veya C mi yoksa başka türlü mi? –

+0

@Quandary: güncellendi. – cHao

+0

Teşekkürler, gerçekten çok basit görünüyor.Gerçekten daha fazla değil mi? Eğer bir müşteri limana her hangi bir şekilde bağlanırsa, "adın ne" diye ismini alır, ismini gönderir ve "Hi " diye geri döner. Ve sanırım zaman aşımı xinetd tarafından ele alındı. Gerçekten çok komik. Ben xinetd programlama bir göz atmak zorunda düşünüyorum, bir sunucu tek bir istemci konsol programı kadar basit görünmesini sağlar. –

1

Inetd hizmetleri, veri alması gereken ve kullanıcıyla bir dereceye kadar etkileşim halinde olan bir uygulama için gerçekten harikadır. IT, viva'yı (x) inetd dizininden (in, out, err) std'ye veri sokarak tcp/udp üzerinden çalışır. inetd uygulamaları, sistem ilke dosyaları ve ACL'ye rağmen güvenliği güvenceye almak için tcpwrappers ile de iyi çalışır.

Evet, gerçekte bir konsol uygulaması olduğu için uygulamanızı bir konsol uygulaması gibi yazabilirsiniz. Ağdan uygulamanızın girişlerine şeffaf bir ters proxy olarak inetd düşünün.

Tavsiye edilen bir kelime, işlem sinyallerini doğru bir şekilde işlemek için kodunuzu yazın ve sistemde başka bir işlemle etkileşime girmeniz gerekiyorsa, bunun için unix soketleri/fifo kullanın. Ayrıca, çok fazla veriyi tek seferde akıtan veya çok fazla bağlantıya ihtiyaç duyan bir uygulama yazmaya da çalışmayın. Inetd bir şişe boynuna dönüştüğü için ölçeklenebilirlik bir sorundur, bu nedenle Apache ve Sendmail inetd için desteği bıraktı ve bunun yerine mono uygulamalar olarak oturdu. HTTP bu role daha iyi uyar ve nginx ile bir fastcgi (veya favori çerçeve ekle) betiği bu kullanım durumu için en iyi şekilde çalışır.

bir inetd'nin iyi bir örnek olacaktır:

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 

Düzenleme senin /etc/services senin böyle bir uygulamanın dahil edilmesine: myapp portu #/proto

ve /etc/inetd.conf (veya xinetd'ye uygulamanızı ekleyin. d) bunun gibi: myapp akışı tcp6 şimdi myappuser/yol/to/myapp myapp -arg_flags

İlgili konular