mein erstes Socket-Programm



  • Hallo,

    ich möchte einen "Datenserver" schreiben der an mehrere Clients
    per Socket Daten übergibt bzw. von einem Client Daten benkommt.

    - Server läuft und wartet bis
    1. Client x Daten an den Server übergibt.
    2. mehrere Clients y Daten vom Server holen.

    eine Art Datenbank, jedoch nur im Ramspeicher.
    z.B.
    Client sendet eine Liste mit "Datennamen" an den Server. Der Server liefert die Datennamen mit den Daten zurück.
    Ein anderer Client sendet Datennamen mit Daten an den Server, der die neunen Daten mit den alten(vorhandenen) aktualisiert.

    Wie erkennt der Server das er Daten senden soll oder Daten empfängt.
    Vielleicht eine Lösung wäre, im Server zwei Ports zu benützen ??

    Bin für jede Anregung dankbar.

    Gruß
    worst_case



  • hi,
    dein Programm (sofern das alles ist) erinnert mich bischen an memcache. Schau dir das mal an, wenn du nicht mehr brauchst.
    Woran liegt es denn - hast du dir schon die API für Sockets angeschaut oder ein Tutorial durchgelesen.

    Der Server wartet auf Events. Sobald sich ein Client verbindet oder Daten an der Server schickt wird so ein Event aufgerufen. Da gibts es mehrere Möglichkeiten das zu programmieren. Schau dir vielleicht mal select() an.
    Wenn der Server Daten ein einen Client schicken soll, muss der Client dem Server das natürlich auch sagen - der Client sendet dann eine Anfrage an den Server und wenn alles stimmt schickt er die Daten an den Client.
    Das war mal so der grobe Ablauf.

    blan



  • Morgen,

    memcache werde ich mir ansehen.
    Socket... soweit so gut.
    Wie und Client und Server zusammen arbeiten habe ich an einem Beispiel am laufen.

    Meine Frage ist: wie könnte die Kommunikation/Daten zwischen den Client und Server aussehen.

    Der Server wartet ja immer und kann nicht erkennen welcher Client gerade die Verbindung aufbauen will.
    Deshalb hätte ich gedacht das der Server auf verschiedenen Ports wartet.
    Port x : warte auf Client der Datenennamen an Server sendet. Server sendet Daten an Client.
    Port y : warte auf Client der Datennamen mit Daten an Server sendet.

    Ich hoffe ihr wisst was ich meine 🙂
    Geht so etwas oder ist das übertrieben, oder hat jemand eine bessere Idee ???
    Fragen über Fragen.

    Gruß
    worst_case



  • Hallo,
    also ich versteh die Frage leider nicht. Vielleicht versucht du nochmal deutlich klar zu machen was das Problem ist. Oder versteht das jemand?

    blan



  • er hat einfach kein problem im ist es in den sinn gekommen er könnte mal was mit sockets machen und hat davon keine ahnung drum hat er hier ne frage gestellt. Aber die frage ist inhaltslos und kann nicht beantwortet werden.
    Vllt. solltest du einfach mal anfangen eine verbindung mit sockets zu erstellen dann einen http client vllt. dann kannst dir nen kleinen server schreiben und dann wird dir auffallen wie man zwischen client und server kommuniziert: man sendet eine anfrage und bekommt eine antwort

    Wie erkennt der Server das er Daten senden soll oder Daten empfängt.
    Vielleicht eine Lösung wäre, im Server zwei Ports zu benützen ??

    hättest du dich mal in die thematik eingelesen könntest du das selber beantworten. Weil das ist ziemlich offensichtlich: 1 Port reicht 2 kannst machen wenn du willst (schau dir als bsp das FTP protokoll an), der server macht nix als zu warten bis er vom client ne connection bekommt und der client sagt ihm dann was er zu tun hat heist der server erkennt das nicht sondern er bekommt es einfach gesagt.



  • Abend,

    tobZel schrieb:

    er hat einfach kein problem im ist es in den sinn gekommen er könnte mal was mit sockets .......

    ganz so ist es nicht. Ich habe in meinem 2. Post geschrieben

    worst_case schrieb:

    Wie und Client und Server zusammen arbeiten habe ich an einem Beispiel am laufen.

    Also bitte...
    Hier mal mein Perl-Code

    # server
    #
    use IO::Socket;
    use strict;
    
    my $newsock;
    my $date;
    
    my %data;
    my $befehl;
    my $gdata;
    
    my $lesecounter = 0;
    my $schreibcounter = 0;
    
    $SIG{CHLD} = "IGNORE";
    
    my $socket = new IO::Socket::INET (LocalPort => 11011, Type => SOCK_STREAM,Listen => SOMAXCONN, Reuse => 1,); die "Unable to setup socket: $!\n" unless defined $socket;
    
    while ($newsock = $socket->accept) 
    {
        if (fork) 
        { # parent
    	$newsock->close;
        } 
        else
        { # child
    
    	($befehl,$gdata)=split(" ",<$newsock>);
    
    	if ($befehl eq "lesen") 
    	{
    	    print "lesen wurde angewaehlt\n";
    	    print $newsock "lesen wurde angewaehlt";
    	}
    
    	if ($befehl eq "schreiben") 
    	{
    	    print "schreiben wurde angewaehlt\n";
    	    print $newsock "schreiben wurde angewaehlt";
    	}
    
    	$newsock->close;
            exit;
        }
    }
    	$socket->close;
    

    Und hier mein Client

    # Client
    #
    use IO::Socket;
    use strict;
    
    my $hostname = shift @ARGV;
    my $socket;
    
        while(1)
        {
    	$socket = new IO::Socket::INET (PeerAddr => $hostname, PeerPort => 11011, Type => SOCK_STREAM,); die "Unable to open connection: $!\n"
    	unless defined $socket;
    
    	print $socket "lesen hallo";
    
    	print while(<$socket>);
    	$socket->close();
    	sleep (1);
        }
    

    Mein Problem liegt darin das der Server "lesen Hallo" empfängt. "Verzweigt" in den Code für "lesen". Der Text "lesen wurde angewaehlt" wird ausgegeben. Jedoch gibt der Server in der Zeile

    print $newsock "lesen wurde angewaehlt";
    

    nichts an den Client zurück. bzw. der Client empfängt nichts.
    Also nochmals. Ich senden vom Client an den Server, der Server macht x.y und sendet das "Ergebnis" an den Client zurück.

    Es kann nur eine Kleinigkeit sein, jedoch sehe ich es nicht.

    Gruß
    worst_case



  • Habe einen ähnlichen Perl-Server
    und mit den Perl-Anwisungen send und recv auch keine Proleme.


Anmelden zum Antworten