frage zu den schnittstellen eines programmes

serverprogramm:
wird aus c/c++ bestehen
baut sobald es gestartet wird ca 50 telnet connections auf. bei diesen geräten wird das login aufgeführt und die connection offengehalten.

clientprogramm:
werden sowohl php scripts als auch c/c++ programme sein.
diese senden anfragen an den server welcher via offene telnet verbindung entsprechende anfragen absetzt und die antwort zurückschickt.

momentan läuft das ganze via php script (ohne server script)...und ist viel zu langsam. durch das verfahren einer bereits offenen verbindung schätze ich einen geschwindigkeitsgewinn um den faktor 7-12 ein. suche keine "schönen" sondern SCHNELLE lösungen.

mein problem ist es nun die schnittstelle zwischen server und client zu definieren. hat da wer ne idee bzw schon erfahrungen mit sowas?
 
Also wenn du zb folgendes Prinzip meinst:

- Server -> verbindung Client
- Server schickt (dedizierte) commands nach client
- client meldet status (or whatever) zurück

Hatte das gleiche gebaut auch mit telnet und hatte eben diese Probleme.
Meine Lösung war eigene peers zu programmieren, server wie auch client und zwar über schlichte TCP sockets. Das ganze resultierte in einer suite zur Fernwartung von Kisten im Intra und Inet.
In nachhinein musste ich jedoch feststellen dass Telnet schon OK war allerdings mein Server das mutlithreaden versaut hatte (einfaches forken)
Bei eigenen clients läuft das ganze wesentlich fixer. Die Anmeldung kannst du dir ersparen . Ich habe schlichtweg meinen definierten port via iptables/chains auf meinen server hin geöffnet (immerhin seit 2 jahren untouched).

Wenn ich falsch liege - sag mal genau was du vorhast und in welchem Kontext.

mfg Thomas

EDIT:

Zur eigentlichen Kommunikation beider peers hatte ich mir einen "pseudoheader" ausgedacht.
Prinzipiell wie der Aufbau eines E-mail headers der stets gleich sein muss.
Beide peers verfügen über einen optimierten code der diese header dann parst, informtaionen daraus gewinnt und dementsprechend aktionen ausführt.
Bestimmte "Schalter" an bestimmten stellen bedeuten zb das starten eines perl scripts etc.
 
ich habe geräte (ca 50 stück) welche via snmp und telnet erreichbar sind. nun ist jedoch nicht alles via snmp erreichbar und ich muss mir gewisse informationen via telnet holen.
das ganze läuft zur zeit via php script welches für eine gewisse abfrage zur zeit 20-25 sekunden benötigt --> viel zu lange. mir ist jedoch aufgefallen, dass das login auf diesen gerät am meisten zeit in anspruch nimmt.
also will ich eine server client architektur.....der server ist mit den geräten immer verbunden. die clients schicken ihre anfrage an den server welche diese bearbeitet und die entsprechende antwort zurückschickt.

mein problem ist nun, dass ich keinen blassen hab wo ich suchen soll....es gibt da "sockets", "pipes", "shared memory" (wenn ich mich recht erinnere kann man so nur unter vater/kind prozess komunizieren), ....


ich scheue mich eigentlich nicht davor, in ein solches thema einzulesen, jedoch hab ich keine ahnung welche möglichkeit die beste für meine zwecke ist. darum auch die frage.

- client und server sollen IMMER auf der selben maschiene laufen.
- auf die config der 50geräte hab ich keinen einfluss (ist also nicht möglich meine zusätzlich gewünschten infos via snmp bereitzustellen)

hoffe das zeigt dir ein wenig genauer was ich vor habe.
 
Hier mal ein kleines Perlstück welches zumindest auf einem Port (siehe configfile) hört. Letztendlich musst du das ganze noch umbasteln und kannst prinzipiell alle möglichen Commands übergeben (ls, mkdir, setenv ..etc etc) und die ausgaben dementsprechend auch wieder zurückschicken.

CLIENT ::

Code:
#!/usr/bin/perl

BEGIN {
  chdir "ABSOLUTER PFAD HIER";
  push @INC, "../conf"; #conf dir
}

use strict;
use vars qw(@ISA);
use Net::Server::PreFork;
no strict 'subs';
@ISA = qw(Net::Server::PreFork);

my %conffile;


#debug 
#&process_request();
#exit;

__PACKAGE__->run(conf_file => "confD.conf");
exit;

sub process_request 
{
  $|=1;
	
  open IN, "confDaemon.conf";
  while(<IN>)
  {
  # print $_;
  # conffile lesen und CMDfoo's ausprinten
    if (/^cmd:(.*?)\s+(.+)[\n\r]/)
    {
       $conffile{$1}=$2;
       print "Commands uebernommen :$1=$2\n";
    }
  }
  close(IN); 
 
  my $self = shift;
  print "+OK echo\r\n";
    	
  while(1)
  {	
	my $blal = <STDIN>;
	print $bla;
  }
 close (STDIN);
    
  if( $@=~/timed out/i )
  {
     	print STDOUT "-ERR Timeout\r\n";
                     return;
  }
}


Hier das Config file:

Code:
cmd:MYls    ls -la    # so kannst du "konstanten" für commands definieren , die   
cmd:MYenv env     # der "client" verarbeiten darf

#NET:SERVER:SPAN
log_file                    server.log		# Pfad der Log-Datei
log_level                   3					# Log Level 0 1 2 3 4

#  user                     benutzer		      		# Auskommentieren bei Bedarf
#  group                    gruppe		      		# Auskommentieren bei Bedarf

pid_file                    server.pid 		# Prozess-ID File 
# pid file anlegen nicht vergessen ..und nicht 1 ;)
background                  1		      			# Im Hintergrund starten -
port                        77   # or whatever
user    root
group   root
child_communication   1

Ist nichts besonderes oder fertiges aber sollte eine Grundlage bieten um das über telnet managen zu können.

(für bugfreiheit übernehme ich keine garantie :) bin kein Perl experte aber bei mir lief es soweit ) Also vielleicht hilfts dir ja weiter
 
thx für deine mühe....jedoch wollte ich mit meiner frage ledigilch wissen welches die sinnvollste art ist wie die 2 programme untereinander daten austauschen.
 
Ich hab davon leider nicht allzuviel Ahnung, aber sollte es nicht über UDP recht gut gehen?

Da das verbingsfrei ist entfällt die Zeit auf die Verbindung.
Da der Server entsprechend Daten an die Clients übermitteln soll könnte er auf einem UDP Port lauschen und wenn ihm der Client ein Paket mit entsprechendem Inhalt schickt die Daten übermitteln.
 
Zurück
Oben