Server sendet an Client



  • Hallo,
    ich möchte einfach nur ein 4 Byte großes Array von einem Server zu einem Client
    mit "ServerSocket, ClientSocket" senden.
    Beide habe ich zum testen auf einem Formular "geht doch oder?".
    Ich habe nur absolut keine Ahnung wie ich das anstellen soll.
    Kann mir Jemand eine Starthilfe geben.



  • Sieh dir das Chat-Beispiel unter %BCB%\examples\internet an. Neben SendText gibt es z.B. auch SendBuffer.
    Beim Testen auf dem eigenen PC verwendest du als Adresse 127.0.0.1 bzw. localhost.



  • in der hilfe des borland c++ builder hat es ein beispiel für server - clientsocket anwendungen.. unter /internet/chat.. teste das mal aus



  • Habe folgendes versucht, bekomme aber eine Exeption
    "ESocketError keine Adresse angegeben" warum?

    char txbuffer[4] = {"123"};
    char rxbuffer[4];
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         ServerSocket1->Port = 5000;
         ServerSocket1->Active = true;
         ClientSocket1->Port = 5000;
         ClientSocket1->Host = "localhost";
         ClientSocket1->Active = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         ServerSocket1->Socket->Connections[0]->SendBuf(txbuffer,4);
         ClientSocket1->Socket->ReceiveBuf(rxbuffer,4);
         Edit1->Text = rxbuffer;
    }
    


  • ich habe das so gelöst

    1x 1 Form mit server

    1x 1 Form mit Client

    dan beide zur selben zeit laufengelassen und es klappt super.. habe auch einen kleinen chat für das geschäft intern programmiert 😉 😃



  • @hermes

    Dein Code funktioniert bei mir.
    Aber bei mir bekomme ich ne Fehlermeldung auf deinem Port.
    Mein Rechner meinte das der Port schon von einer andern Anwendung benutz wird.
    Du solltest mal den Port ändern.
    Versuche doch mal beispielsweise Port 80.
    Ich hoffe das bringt was.

    LG raven 🕶



  • raven_22 schrieb:

    Mein Rechner meinte das der Port schon von einer andern Anwendung benutz wird.

    Und genau das ist der Punkt! Jeder Socket belegt genau EINEN Port. D.h. Wenn dein Server den Port 5000 belegt, wird dein Client den nicht mehr nutzen können.



  • Das ist genau nicht der Punkt. 😉
    Lediglich bei Servern, d.h. Sockets im listen-Modus, kann es jeweils immer nur einen pro Port geben. Clients können auf diesen Port soviele zugreifen wie der Rechner resourcenmässig verkraftet. Dabei spielt es keine Rolle, ob der Client auf demselben Rechner läuft oder nicht.



  • Hmm ich war bisher der Ansicht, dass wenn ein Client und ein Socket auf dem selben Rechner den selben Port beanspruchen wollen, es nicht funktioniert.

    Hab leider ichts hier um das mal durchzutesten!



  • Hi ich bekomme fehlermeldung: Der Index der Liste überschreitet das Maximum(0);

    was bedeutet es?

    Gruß,
    S.mathi



  • smathi2002 schrieb:

    Hi ich bekomme fehlermeldung: Der Index der Liste überschreitet das Maximum(0);

    Wie wär's wenn du die Suche nutzt? Wie wärs wenn du nen eigenen Thread dazu aufmachst, als in einem zu posten, der aber auch rein gar nichts mit deinem Problem zu tun hat? 🙄

    Stichwort: Index out of Bounds



  • Ich habe nun einen Client sowie Server beide Port 5000 auf einem rechner
    zum laufen gebracht.
    Wenn der Server läuft und ich dann den Client starte kommt das Ereigniss ClientConnect beim Server.
    Nun kann ich Daten vom Client zum Server senden.
    Benutze ich allerdings für den Client einen zweiten Rechner der über einen DSL Router verbunden ist funkt es nicht mehr obwohl ich an den Led's des
    Routers einen Zugriff auf das Lan Netz sehe.
    Ich kann auch keine anderen Ports nutzen, dann kommt immer die Fehlermeldung
    "Der Wert kann nicht geändert werden, während der Socket aktiv ist" beim Server.
    Übrigens hat der Server den Port 5000 lauscht er nach allen Clients die
    den selben Port haben.

    Folgendes funktioniert:

    //-----------------------------------------------
    // Client
    //-----------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         ClientSocket1->Port = 5000;
         ClientSocket1->Address = "192.168.2.101";     //IP des Clients
         ClientSocket1->Host    = "192.168.2.100";	   //IP des Servers
         ClientSocket1->Active = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket)
    {
         ClientSocket1->Socket->ReceiveBuf(&a,2);		//Daten vom Server
         Edit1->Text = a;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TrackBar1Change(TObject *Sender)
    {
         test = TrackBar1->Position;
         Edit1->Text = TrackBar1->Position;
         ClientSocket1->Socket->SendBuf(&test,2);		//Daten zum Server
    }
    
    //-------------------------------------------------------
    // SERVER
    //-------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         ServerSocket1->Port = 5000;
         ServerSocket1->Active = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
        Form1->Edit1->Text = "CONNECT";			//Sobald Client startet tritt das Ereigniss auf
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
         Socket->ReceiveBuf(&test,2);			//Daten vom Client 	
         Edit2->Text = test;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TrackBar1Change(TObject *Sender)
    {
         test = TrackBar1->Position;
         ServerSocket1->Socket->Connections[0]->SendBuf(&test,2); //Daten zum Client
    }
    

    Habe aber immer noch ein Problem wenn ich einen anderen Port wähle



  • Du musst den Port 5000 "Forwarden" sprich freigeben, sonst wird er von deinem Router blockiert.



  • Hallo hermes,
    in der Hilfe zum Client habe ich gelesen:
    "Die Eigenschaft Host ist ein Alias für die IP-Adresse des Server-Systems.
    Die Eigenschaft Address bezeichnet die IP-Adresse des Server-Systems."

    Hieraus schliesse ich, dass sich beide Eigenschaften auf den Server beziehen. In deinem Code ist das etwas anders

    //-----------------------------------------------
    // Client
    //-----------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         ClientSocket1->Port = 5000;
         ClientSocket1->Address = "192.168.2.101";     //IP des Clients
         ClientSocket1->Host    = "192.168.2.100";       //IP des Servers
         ClientSocket1->Active = true;
    }
    

    Bin mir nicht sicher ob das ein Grund mit ist.
    Evi48



  • Hallo evi48,

    ClientSocket1->Address = "192.168.2.101"; //IP des Clients
    ist die Host Adresse des Clients

    ClientSocket1->Host = "192.168.2.100"; //IP des Servers
    ist die Host Adresse des Servers.

    Ich habe heute auf der Arbeit im LAN ein wenig rumprobiert und habe
    eine von mir programmierte Testsoftware mit einem ClientSocket versehen.
    Auf einem anderen Rechner lief ein Server mit dem ich die Testsoftware
    über LAN Fernsteuern konnte.
    Da die ganze Sache funktionierte also sind die Angaben oben richtig.

    Allerdings versuche ich das ganze im WAN und nicht im LAN, leider klappt
    das nicht.
    ClientSocket->Adresse = "meine WAN IP"
    ClientSocket->Host = "WAN IP eines Kollegen"

    Ich muss dazu sagen das ich hinter einem DSL Router hänge.



  • Checkliste

    1. hast du den Hinweis von PuppetMaster2k befolgt und den router konfiguriert ?
    2. hast du versucht mit ping eine Verbindung zu testen ?
    3. hast du einen anderen port versucht?



  • ich habe mir ein client-server programm geschrieben, das übers netz (im geschäft durchs ganze Netzwerk) und aber auch übers internet funktioniert
    dabei ist meine "einzige" angabe

    ClientSocket1->Host = IP;
    

    wobei ich aber

    ClientSocket1->Adress
    

    nichts zuweise.

    [edit] Port wird natürlich auch angegeben [/edit]



  • Die Frage ist jetzt, willst du damit übers Internet (WAN) eine Verbindung aufbauen oder über das W-LAN? Wenn übers Internet, dann kommst du mit deiner lokalen IP nicht weit, weil du dann die IP, die dir dein Provider zugewiesen hat, benötigst.

    Wenn du übers W-LAN gehn willst, dann geh so vor, wie AndreasW schon sagte!



  • AndreasW schrieb:

    Checkliste

    1. hast du den Hinweis von PuppetMaster2k befolgt und den router konfiguriert ?
    2. hast du versucht mit ping eine Verbindung zu testen ?
    3. hast du einen anderen port versucht?

    Bei dem Router habe ich die Firewall disabled.
    Die Verbindung wurde mit Ping getestet.
    Allerdings habe ich als "Client Host Adresse" die Adresse des Rechners und nicht die WAN IP angegeben, ist das vieleicht das Problem?



  • PuppetMaster2k schrieb:

    Die Frage ist jetzt, willst du damit übers Internet (WAN) eine Verbindung aufbauen oder über das W-LAN? Wenn übers Internet, dann kommst du mit deiner lokalen IP nicht weit, weil du dann die IP, die dir dein Provider zugewiesen hat, benötigst.


Anmelden zum Antworten