Windows Sockets / Borlands TServerSocket Komponente



  • Hallo Gemeinde,

    ich beschäftige mich im Moment mit der TServerSocket Komponente von
    Borland. In der Hilfe habe ich einen Verweis auf "see the Microsoft documentation for Windows sockets" gefunden.

    Was bedeutet das? Welche Dokumentation ist gemeint und wo finde ich diese?

    Desweiteren hab ich hier im Forum gelesen die TServerSocket Komponente
    würde sich für die Datenübertragung nicht eignen. Warum nicht?
    Wesshalb sollte man die Indy Komponente verwenden?

    So wie ich das verstanden habe ist die Indy Komponente nicht von Borland oder?

    Liebe Grüße!



  • Hallo

    Microsoft:
    Damit ist wohl die MSDN gemeint. Das ist Microsoft zentrale Sammlung an veröffentlichten Dokus. Allerdings ist die auch recht groß und unübersichtlich...

    TServerSocket:
    Wo hast du das gelesen? Dann klärt sich vielleicht diese Aussage.

    Indy:
    Ja das Indy-Paket ist nicht von Borland.

    bis bald
    akari

    /Edit : URL korrigiert



  • Hallo akari,

    danke für deine Antwort.
    Ich glaub du hast dich bei der Eingabe der Url vertippt.

    Gruß!



  • Hallo

    Danke... war nicht vertippt sondern falsch kopiert.

    bis bald
    akari



  • Ist es möglich eine Mp3 Datei über die TServerSocket bzw. TClientSocket Komponente zu versenden?

    Wenn ja, wäre jemand so nett und gibt einen Link zu einem Tutorial oder vergleichbares an damit man sich mal so einen Beispiel Code anschauen kann?

    Gruß!



  • Ich erinnere mich, daß ich etwas Vergleichbares schon einmal auf der Basis von TServerSocket/TClientSocket versucht habe, dann aber entnervt aufgab und die Indy-Komponenten einsetzte; mit denen ging das intuitiv und problemlos.



  • Hi audacia,

    könntest du beschreiben was genau du für Probleme hattest und
    was nicht funktioniert hatte?

    Mich würde es interessieren da ich unter Windows Sockets eigentlich
    eine ganz normale (tüchtige) Verbindung verstehe die ja eigentlich
    ohne große Probleme den Informationsaustausch zwischen zwei Knoten
    ermöglichen sollte.

    Kennst du zur Indy Komponente gute Quellen oder kannst du ein
    gutes Tutorial empfehlen?

    Gruß!



  • ^^ Bei den Indy-Komponenten sind Beispiele dabei, oder Du schaust mal auf deren Homepage. Sind eine gute Grundlage zum basteln.



  • Not The One schrieb:

    könntest du beschreiben was genau du für Probleme hattest und
    was nicht funktioniert hatte?

    Die wesentliche Schwierigkeit war IIRC, eine synchrone, protokollgesteuerte Übertragung größerer Datenblöcke zu realisieren. Sobald man Blöcke übertrug, die größer waren als der interne Puffer, hatte ich Synchronisationsprobleme. Ich weiß nicht, ob ich diese durch großen Aufwand vielleicht noch hätte lösen können, denn ich habe mir weitere Mühe nicht gemacht, nachdem es mit den Indy-Komponenten auf Anhieb funktionierte.

    Not The One schrieb:

    Mich würde es interessieren da ich unter Windows Sockets eigentlich eine ganz normale (tüchtige) Verbindung verstehe die ja eigentlich ohne große Probleme den Informationsaustausch zwischen zwei Knoten ermöglichen sollte.

    Die Windows-Sockets sind nicht das Problem; auch die Indy-Komponenten basieren darauf. Schwierigkeiten macht die wenig protokollfreundliche Implementierung von TClientSocket/TServerSocket.



  • Damit kannst du die Dateien schicken.

    Server:

    Du brauchst:OpenDialog1 (TOpenDialog), Server (TServerSocket), Memo1 (TMemo) und zwei Buttons.

    Zu erst stellen wir den Serverkomponent in Object Inspector ein:

    Port = 1001 ;
    Active = false ;

    //---------------------------------------------------------------------------
    TForm1 *Form1;
    TMemoryStream *MS = new TMemoryStream ;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerAccept(TObject *Sender,
          TCustomWinSocket *Socket)
    {
          Memo1->Lines->Add("Connected");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerClientError(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
          ErrorCode = 0 ;
          ShowMessage("Server Error");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
          Server->Active = true ;
          Server->Open() ;
          Memo1->Lines->Add("Server is created");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
          Server->Close();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
          void *P;
          int Size ;
          if(OpenDialog1->Execute())
          {
                MS->LoadFromFile(OpenDialog1->FileName);
                Memo1->Lines->Add("File was loaded...");
          }
          Server->Socket->Connections[0]->SendText("file#"+OpenDialog1->FileName+"#"+IntToStr(MS->Size)+'#');
          Memo1->Lines->Add("Information about the file was sent");
          MS->Position = 0 ;
          P = MS->Memory ;
          Size = Server->Socket->Connections[0]->SendBuf(P,MS->Size);
          Memo1->Lines->Add("Was sent: " + IntToStr(Size)+" from "+       IntToStr(MS->Size));
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
          if(Server->Socket->Connections[0]->ReceiveText()=="end")
          {
                Memo1->Lines->Add("Client has received the file");
                MS->Clear() ; 
          }
    }
    

    Client:

    in .h (Header):
    private:
    AnsiString Name;

    in cpp:
    Du brauchst: Client (TClientSocket) , Memo1 (TMemo), SaveDialog1 (TSaveDialog) und Button1 (TButton)

    Client Optionen:

    Port = 1001 ;
    Active = false ;
    Address = 127.0.0.1 ; //Zum Testen benutzen wir locale IP Adresse
    Host = 127.0.01 ;

    TForm1 *Form1;
    TMemoryStream *MS = new TMemoryStream ; 
    void Write(AnsiString Text);  
    int Size ; 
    bool Receive ; 
    AnsiString FileName ;  
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void Write(AnsiString Text)
    {
          if(MS->Size < Size)  
          {
                MS->Write(Text.c_str(),Text.Length()); 
                Form1->Memo1->Lines->Add("Receiving data"); 
          }
          if(MS->Size == Size)
          {
                Receive = false ; 
                MS->Position = 0 ;
                Form1->Client->Socket->SendText("end"); 
                CreateDir("Downloads");
                MS->SaveToFile("Downloads\\"+FileName); 
                MS->Clear() ; 
                Size = 0 ;
                Form1->Memo1->Lines->Add("Die Datei ist da!!!");
          }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientConnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
          Memo1->Lines->Add("Is connected ");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientError(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
          ErrorCode = 0;
          ShowMessage("Client Error");        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
          Client->Open() ;  
          Memo1->Lines->Add("Trying to connect");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
          AnsiString Rtext ;  
          Rtext = Client->Socket->ReceiveText() ;
          if(Receive == true) 
          {
                Write(Rtext); 
          }
          else 
          {
                Memo1->Lines->Add("Received text" + Rtext);
                if(Rtext.SubString(0,Rtext.Pos("#")-1) == "file")
                {
                      Rtext.Delete(1,Rtext.Pos("#")) ;    
                      Name = Rtext.SubString(0,Rtext.Pos("#")-1); 
                      FileName = Name.SubString(Name.LastDelimiter("\\")+1,Name.Length()); ; 
                      Rtext.Delete(1,Rtext.Pos("#")) ;  
                      Size = StrToInt(Rtext.SubString(0,Rtext.Pos("#")-1)) ; 
                      Rtext.Delete(1, Rtext.Pos("#")); 
                      Memo1->Lines->Add("Die Datei ist  "+IntToStr(Size)+" groß"); 
                      Memo1->Lines->Add("Die Datei heißt: "+Name); 
                      Receive = true; 
                }
          }
    }
    //---------------------------------------------------------------------------
    

    Wenn es etwas nicht klar ist, werde ich die detalierte Beschreibung machen.
    Aber ich denke, dass die Sourcen lesbar sind.
    Grüß,
    Sergey.


Anmelden zum Antworten