Grundsätze der Socketprogrammierung
-
Hallo liebe C++Builder user,
ich mächte gerne ein Netzwerkfähige Datenbank schreiben. Heist, die Clienten, können die auf dem Server gespeicherte Stings aufrufen und ändern und wieder auf dem Server speichern. Dazu möchte ich gerne Sockets verwenden.
Leider habe ich kein Tutorial gefunden, welches die Grundsätze der Socketprogrammierung mit dem C++ Builder erklärt. Känntet ihr mir dabei helfen? Ich suche ein Turorial, das wirklich die Basiks für Clienten sowie die das Servers erklärt.
Danke schonmal im vorraus für eure Antworten,
LG L
PS: Ich suche was für Dumme/Dummys, also für mich geeignetes, da ich auf diesem Gebiert totaler neuling bin
-
Wenn du die C++-Builder-Komponenten verwenden willst, kannst du unter Examples mal gucken, da ist ein Beispiel fuer einen einfachen Chat, ist nicht viel Code, aber erklaert sich fast von selbst.
Wenn du lieber mit den Win32-Socket-Komponenten dir selbst was schreiben willst, kannst du dir mal http://www.c-worker.ch/tuts/wstut_op.php angucken. Ist zwar nicht das neueste, aber erklaert die wichtigsten Dinge, jedenfalls habe ich mir darauf aufbauend eine eigene Socket-Klasse geschrieben, und das ist wirklich nicht schwer
-
Danke für deine Antwort.
Ich möchte die Standart Komponenten verwenden. Die Hilfedateien habe ich mir angesehen und es auch hinbekommen einfache Texte zu versenden.
Wie kann ich es anstellen, dass mein Server welcher ja die Datenbankfiles beaufsichtigt dem Clienten die Daten ausgibt die er haben will.
Beipsiel: Stringlist für Usernamen und Stringlist für PW aus einem File ausgelesen umd auf dem Server im Arbeitsspeicher gespeichert.
Nun loggt sich auf dem Client einer ein, gibt dein Usernamen und PW an. Heist, die Server werden 2 Angaben zugeschickt also z.B. Username: L und PW: Test
Wie weis der Server, dass er diese beiden Angaben mit den Angaben aus der Username und PW Stringlist vergleichen soll? Habt ihr Ideen?
LG L
-
Hi ihr,
es sind noch 2 weitere Fragen aufgetauchtFrage 1:
Ich habe versucht mal zum Test einen kleinen Chat zu schreiben, also man gibt eine nachricht ein und die wird vom Server an alle Clienten weiterverschickt. Wie kann ich mir die Anzahl der Registrieren Clienten ausgeben lassen und wie kann ich sagen, dass ist Client 0 das 1, 2,..., und dann eine Nachricht an alle schicken da man ja bei SendText immer die Connection zum Clienten mit angeben muss?
Frage 2:
Wenn ich jetzt mit dem Builder einen Server schreibe, weil ich den dann Online auf meine Root-Server laufen lassen, dies ist allerdings ein Debian Linux server, was muss ich beachten, bzw. was kann ich tun, damit mein Server auf Linux (bestenfalls auf Linux und Windows (eventuell 2 Exen) läuft?
Bitte um eure Hilfe, danke
-
Hallo
L schrieb:
Ich habe versucht mal zum Test einen kleinen Chat zu schreiben, also man gibt eine nachricht ein und die wird vom Server an alle Clienten weiterverschickt. Wie kann ich mir die Anzahl der Registrieren Clienten ausgeben lassen
Siehe TServerSocket::Socket::ActiveConnections
und wie kann ich sagen, dass ist Client 0 das 1, 2,..., und dann eine Nachricht an alle schicken da man ja bei SendText immer die Connection zum Clienten mit angeben muss?
Mit einer Schleife über TServerSocket::Socket::Connections, siehe auch BCB-Hilfe.
Wenn ich jetzt mit dem Builder einen Server schreibe, weil ich den dann Online auf meine Root-Server laufen lassen, dies ist allerdings ein Debian Linux server, was muss ich beachten, bzw. was kann ich tun, damit mein Server auf Linux (bestenfalls auf Linux und Windows (eventuell 2 Exen) läuft?
Das geht nicht. Builder-Programme laufen nur unter Windows.
Wenn du wirklich ein portables Programm unter C++ schreiben willst must du ein portables Framework wie wxWidgets anstelle der VCL des Builders nehmen.
bis bald
akari
-
Danke werde mal schauen,
wie sieht es mit einer lösung für meinen 2. Post aus? Jemand ne Idee?
-
Hallo
Du must dir ein Protokoll entwickeln, wo der Client weiß mit welcher Syntax er welche Daten in einem festen Format bekommt. Stell es dir wie ein Chat vor, bei dem nur genau definierte Fragen nach genau definierten Werten erlaubt sind.
bis bald
akari
-
Danke für deine Hilfe,
ich werde es Versuchen.Noch ein paar Fragen, wenn ich einen Socketserver unter für meinem Rootserver welcher auf Linux (debian) läuft programmieren will, welches Programm ist dafür geeignet und was muss ich bei der Programmierung beachten (ist ja sicherlich anders als mit dem VCL vom Builder). Das Beachten bezieht sich darauf, dass das ganze Später auch unter Debian läuft und zum 2 darauf, wie ich dann die Sockets verschicken kann etc. Gibt es dafür vieleicht ein Tutorial? Oder könntest du es mir eventuell an einem kleinen Serverbeispiel zeigen?
LG
L
-
*push*
Hatt keiner hilfe fuer mich?
-
Hallo
Dafür bist du hier im falschen Forum. Wenn du Hilfe für Linux-Programmierung haben willst must du ins Linux-Forum gehen. Wenn du Hilfe für portable Netzwerk-Programmierung haben willst, must du ins C++ Forum gehen (dort wird man dir zu boost::asio raten).
bis bald
akari
-
Ok, danke. Ich werde mich dort mal melden.
Noch eine Frage zur Socketprogrammierung im Builder. Wie kann ich vom Server bestimmen lassen, von welchem Clienten das Signal kommt?
Moechte eine OnConnect reagtion des Servers haben
Beispiel
Client Connected -> Server->Sendet, "Verbindung Hergestellt"Wie kann ich auslesen, dass die OnConnect reaktion (oder eben der Socket) von dem Clienten x gesendet wurde ?
Bitte um schnelle Hilfe.
LG
L
-
Hat dazu keiner eine loesung??? Bitte, brauche dringen Hilfe.
Hier nochmal mein Problem mit ein paar mehr Details:
ich bin nun dabei, erstmal Testweise ein Programm für Windows mit dem C++ Builder 6 von Borland zu machen.
Klappt auch soweit (verbindung aufnehmen und Sockets verschicken). Nun wollte ich aber, das der Client ein Socket an den Server schickt und dieser eine Antwort nur an genau diesen Clienten verschickt. Wie kann ich das bewerkstelligen.
Die ID des Clienten ist ja meines wissens nach nicht fest. Sobald dich jemand ausloggt, rutschen alle Clienten nach. Mit welchem Befehl, kann ich vom ServerSocket die Client-Adresse den Clienten angeben, auf wessen Socket gerade vom Server reagiert wird.
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { //EMPFANGEN DES STEAMS TMemoryStream *Empfangen = new TMemoryStream; { int BufferGroesse = Socket->ReceiveLength(); BYTE *Buffer_BYTEp = new BYTE[BufferGroesse]; Socket->ReceiveBuf(Buffer_BYTEp, BufferGroesse); Empfangen->WriteBuffer(Buffer_BYTEp, BufferGroesse); Empfangen->SaveToFile("Empfangen.tmp"); DatenEmpfang->LoadFromFile("Empfangen.tmp"); DeleteFile("Empfangen.tmp"); delete [] Buffer_BYTEp; delete Empfangen; } }
Daten werden in diesem Code empfangen. Nun soll an den Clienten, welcher die Reaktion ausgeloest hat eine Antwort schicken (und nur an den Clienten nicht an alle)
TMemoryStream *Connect = new TMemoryStream; //ERSTELLE DATEN DatenSend->Add("sys01"); DatenSend->Add("TEXT MEINER WAHL"); DatenSend->SaveToFile("Sending.tmp"); DatenSend->Clear(); Connect->LoadFromFile("Sending.tmp"); DeleteFile ("Sending.tmp"); ServerSocket1->Socket->Connections[x]->SendStream(Connect);
Hierbei soll dan an der Stelle
ServerSocket1->Socket->Connections[x]->SendStream(Connect);
das x = der SocketID entsprechen.
Ich hoffe ihr koennt mir helfen. Bin ueber jede Hilfe dankbar.
Danke für eure Hilfe
LG L
-
L schrieb:
Mit welchem Befehl, kann ich vom ServerSocket die Client-Adresse den Clienten angeben, auf wessen Socket gerade vom Server reagiert wird.
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) ...
Was meinst du, wozu dir da ein TCustomWinSocket*-Parameter übergeben wird?
-
Danke fuer deine Schnelle Antwort. Leider verstehe ich leider nicht ganz, wie ich das nun bewerkstelligen kann.
Was schreibe ich nun anstelle des X rein?
Bitte erklaere es mir nochmal fuer "Dumme"!
Danke
-
L schrieb:
Was schreibe ich nun anstelle des X rein?
Gar nichts. Du benutzt einfach
Socket
anstelle vonServerSocket1->Socket->Connections[whatever]
.
-
Lol, das ist so einfach....man, ey wtf und ich sitze da 2 Tage dran und versuche mir eigene Funktionen und Methoden zu schreiben, welche das erledigen.
Vielen Vielen dank!!! Du hast mir sehr geholfen!!!