[C++] Diverse Fragen

04/26/2010 14:42 Sayael#1
So, vorab, ich bin nicht so die Leuchte in C++, hoffe aber darauf, dass ihr mir Erleuchtung bringen könnt.

Folgendes, ich habe einen Server erstellt und habe diverse Clients. Nun verbinde ich mich mit den Clients auf den Server, welcher mir in einer ListBox anzeigen soll, welcher Benutzer, Clients müssen sich vorher autorisieren, mit welcher IP mit dem Server verbunden ist.
Wie realisiere ich, dass der Server mir die Clients mit Username und IP anzeigt und ich möglicherweise auch deren Verbindung unterbrechen kann.

2. Problem:
Clients können sich Spiele vom Server ziehen, jeder Client besitzt eine ListBox in der verfügbare Spiele aufgelistet sind. Wie kann man durch Doppelklick in der ListBox das gewünschte Spiel anfordern?

3. Problem:
Wie realisiere ich, wenn mehrere Clients gleichzeitig spielen und nach jeder Runde der Highscore gespeichert wird.
Ich meine mich noch daran zu erinnern, dass es Probleme geben wird wenn mehrere Clients gleichzeitig in die Datenbank schreiben wollen.
04/26/2010 15:13 scbiz#2
Deine Fragen lassen aber stark vermuten, dass dein bisheriger Erfolg ausschließlich auf Copy&Paste basiert. Wie wäre es wenn du ein wenig des Quelltexts offenlegst?
04/26/2010 16:28 Sayael#3
Nein, mein bisheriger Erfolg basiert nicht auf C&P.

Client, heutiger Stand:
Code:
//$$---- Formular-CPP ----
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uProjekt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain2 *frmMain2;
//---------------------------------------------------------------------------
__fastcall TfrmMain2::TfrmMain2(TComponent* Owner)
	: TForm(Owner)
{

sgSpiele->Cells [0][0] = "Punktestand" ;
sgSpiele->Cells [1][0] = "Spielername" ;
sgSpiele->Cells [2][0] = "Datum" ;
//sgSpiele->Cells [3][0] = "Highscore" ;
//sgSpiele->Cells [4][0] = "Datum" ;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain2::btnZeigenClick(TObject *Sender)
 {
  tblHighscore->ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Spieler.mdb;User Id=admin;Password=;";
  tblHighscore->TableName = "tblHighscore";

 tblHighscore->Active = true;
  sgSpiele->RowCount = 2;

  int anz=0;
  tblHighscore->First();

  while(!tblHighscore->Eof) {
	anz++;
	tblHighscore->Next();
  }


  tblHighscore->First();
  for(int i=1; !tblHighscore->Eof; i++) {
	sgSpiele->Cells[0][i] =  tblHighscore->FieldByName("Punktzahl")->AsString;
	sgSpiele->Cells[1][i] =  tblHighscore->FieldByName("Username")->AsString;
	sgSpiele->Cells[2][i] =  tblHighscore->FieldByName("Datum")->AsString;

	tblHighscore->Next();
	sgSpiele->RowCount++;
  }
    tblHighscore->Active = false ;

 }
//---------------------------------------------------------------------------

void __fastcall TfrmMain2::btnVerbindenClick(TObject *Sender)
{
  cs->Address = edtServerIP->Text;
  cs->Port = StrToInt(edtPort->Text);
  cs->Active = true;
  btnVerbinden->Enabled = false;
  btnTrennen->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain2::btnTrennenClick(TObject *Sender)
{
  cs->Active = false;
  btnVerbinden->Enabled = true;
  btnTrennen->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain2::csConnect(TObject *Sender, TCustomWinSocket *Socket)
{
  ShowMessage("Verbindung steht");
}
//---------------------------------------------------------------------------


void __fastcall TfrmMain2::btnStatusClick(TObject *Sender)
{
if (btnVerbinden->Enabled == false) {
  pnlStatus->Caption = "Online";
  pnlStatus->Color = clLime;
}
else if (btnVerbinden->Enabled == true) {
  pnlStatus->Caption = "Offline";
  pnlStatus->Color = clRed;
}
}
//---------------------------------------------------------------------------
Server heutiger Stand:
Code:
//$$---- Formular-CPP ----
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartenClick(TObject *Sender)
{
  ServerSocket->Port = edtPort->Text.ToInt();
  ServerSocket->Active = true;
  btnStarten->Enabled = false;
  btnStop->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender)
{
  ServerSocket->Active = false;
  btnStarten->Enabled = true;
  btnStop->Enabled = false;

  btnStatus(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStatusClick(TObject *Sender)
{
if (btnStarten->Enabled == false) {
  pnlStatus->Caption = "Online";
  pnlStatus->Color = clLime;
}
else if (btnStarten->Enabled == true) {
  pnlStatus->Caption = "Offline";
  pnlStatus->Color = clRed;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAktuClick(TObject *Sender)
{
  lbSpieler->Clear();
  tblSpieler->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbSpiel.mdb;User Id=admin;Password=;";
  tblSpieler->TableName = "tblBenutzer";
  tblSpieler->Active = true;
  tblSpieler->First();
  AnsiString ausgabe;
  while (tblSpieler->Eof==false) {
	for (int i=0; i<tblSpieler->FieldCount; i++) {
	  ausgabe = ausgabe + tblSpieler->Fields->Fields[i]->AsString+" ";
	}
	lbSpieler->Items->Add(ausgabe);
	ausgabe="";
	tblSpieler->Next();
  }
  tblSpieler->Active = false;	
}
//---------------------------------------------------------------------------
04/26/2010 18:28 xNopex#4
Quote:
2. Problem:
Clients können sich Spiele vom Server ziehen, jeder Client besitzt eine ListBox in der verfügbare Spiele aufgelistet sind. Wie kann man durch Doppelklick in der ListBox das gewünschte Spiel anfordern?
Auch die VCL sollte über eine Art Event-System verfügen. Hab ein bisschen Google verwendet und bin [Only registered and activated users can see links. Click Here To Register...] gestoßen. Habs kurz überflogen, vllt. hilfts dir ja. Wenn nicht, dann steig doch auf z.B. QT oder WxWidgets um. Für TCP/UDP/.. empfiehlt sich vllt. auch boost::asio.

Quote:
3. Problem:
Wie realisiere ich, wenn mehrere Clients gleichzeitig spielen und nach jeder Runde der Highscore gespeichert wird.
Ich meine mich noch daran zu erinnern, dass es Probleme geben wird wenn mehrere Clients gleichzeitig in die Datenbank schreiben wollen.
Du lässt deinen Server die DB schreiben..
04/27/2010 15:39 Sayael#5
Dank dir und jetzt nochmal hierzu bitte was halbwegs verständliches/logisches :)

Quote:
Wie realisiere ich, dass der Server mir die Clients mit Username und IP anzeigt und ich möglicherweise auch deren Verbindung unterbrechen kann.
04/29/2010 01:52 wurstbrot123#6
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Die Daten dann natürlich vom Client aus dem Server schicken.
Wegen listbox...kommt halt auch drauf an was du
für den GUI benutzt. Zum disconnecten, könntest du halt
die Sockets den Usern zuweisen ( die Daten bekommst du ja
vom client ) und dann den Socket schliessen ( socketname.close() ).
Den Client vorher eventuell den Disconnect mit einer Nachricht mitteilen ^^
04/29/2010 11:30 schlurmann#7
Du zeigst und ja nicht 'mal von welchem Typ deine ganzen spaßigen Objekte da sind. Wie soll ich denn da auch nur irgendeine Information entnehmen?