Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 06:57

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Mai 13, 2004 20:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hi!

Mal folgende Frage... ;)
Ich habe mal bissl mit den socket Kompos rumprobiert (RESPEKT besser als Indy ;) ) Also, von der Benutzung her ^^

Jetzt zu meiner Frage:
Ich möchte mehrere Clients drauf connecten lassen.
Jetzt habe ich einen Array von meiner Spieler Klasse.
In diesem, habe ich für jeden Client ne Nummer, kann ich jetzt sehen von welchem Client in nen Record geschickt bekommen habe?
Schön wärs :-D

EDIT: PS: Wie hastes denn zB. bei napalmbomber gemacht? @SOS

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 13, 2004 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich sende bei jedem Datenpaket die Spielerkennung mit, die dem Client beim Verbindungsaufbau zugewiesen wurde. Sieht in etwa so aus :
Verbindung :
- Client verbindet zum Server
- Server vergrößert Spielerarray und gibt das höchste Element des Arrays an den Spieler als ID
Im Spiel :
- Client sendet seine Spielerdaten inkl. ID
- Server schreibt Spielerdaten ins Array anhand der ID

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 13, 2004 21:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh klinkt plausibel, thx...
werd ich morgen mal umsetzen :D

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 13, 2004 21:27 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
das eröffnet tolle möglichkeiten zum cheaten ;-) einfach mal den gegenspieler bewegen... bei vielen socket klasen, kann man verbindungen auch in threads kapseln - die können dann einen spieler alleine handeln und du riskierst nicht, dass jemand anfängt, über gefälschte ids mithilfe von proxys oder routern zu ändern und plötzlich andere spieler zu bewegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 14, 2004 11:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh, eigentlich kann man niemanden bewegen, die eigene position und so, ist ja auf meinem Rechner.
Die kann also niemand bewegen oder?
Höchstens, das sie verfälscht angezeigt wird bei nem andere client...

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 15, 2004 17:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ich glaube diese nachfolgende Frage passt hier gut rein ;)

Also, ich habe keinen Schimmer, wo ich vom Client aus die Daten senden soll.
Im Ivents-OnIdle, dort wo gezeichnet wird?
Oder besser nen Timer?

Wenn wenn ichs dahin mache, wo gezeichnet wird, schränkt das die Frames ziemlich ein oder?

_________________
www.audi32.de


Zuletzt geändert von Adler am Sa Mai 15, 2004 18:12, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 15, 2004 18:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ne, in jedem Frame zu senden schadet den FpS nicht unbedingt, wird aber zu 100% dafür sorgen das du quasi die "Ports" des Server fluten tust und der dadurch me Menge Packete dropt. Also entweder im Timer, oder nur dann senden wenn sich was geändert hat.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 15, 2004 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh, da eigentlich die ganze Zeit Veränderungen sind,
gehe ich lieber auf einen Timer?
Ok, das dazu.
wenn ich ihn auf 20 stelle, weiß ich net ob das gut ist, da das manchmal entscheident sein kann, für alle Beteiligten.
Stell dir vor einer verliert obwohl er 10 hundertstel schneller war...
Ich leg mal los, aber über den Intervall diskutieren wir noch ;)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 15, 2004 20:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
wenn du einen Timer benutzt und das Interval zu niedrig einstellst wird das alelrdings auch garantiert zu schwierigkeiten führen, wenn z.B. das Timerinterval so klein ist, dass die NAchrichten in dieser ZEit garnicht immer abgeschickt werden können...
außerdem gibt es dann das Problem, dass mehrere nacheinander abgeschickte PAkete auf einmal ankommen können (nur bei sendtext so ??)
du könntest vom Server immer erst eine Bestätigung schicken lassen und wenn diese eingetroffen ist die nächste Aktualisierung losschicken...

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 16, 2004 11:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mh, so hab ichs jetzt auch gemacht.

Code:
  1. procedure TDemoForm.SSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
  2. var
  3. buff: Tspieler_info;
  4. begin
  5. logfile.Add('** Client hat nen Record gesendet **');
  6. logfile.SaveToFile(extractfilepath(paramstr(0))+'logfile.txt');
  7. socket.ReceiveBuf(buff,socket.ReceiveLength); //Hier gibts Probleme
  8. gegnerinfo[buff.LANID].Spieler_info := buff;
  9. logfile.Add('Rocrod an gegnerinfo['+inttostr(buff.LANID)+'] übergeben');
  10. logfile.SaveToFile(extractfilepath(paramstr(0))+'logfile.txt');
  11. //ssocket.Socket.Connections[buff.LANID].SendText('OK');
  12. end;


Das logfile hab ich mal in die ganze Anwendung eingebaut, um zu sehen was da so abgeht(hab ich von SOS gelernt \";)\").
Mein Problem ist, das er in der Zeile
Code:
  1. socket.ReceiveBuf(buff,socket.ReceiveLength);

Mich in das \"CPU\" Fenster kickt. Aber er arbeitet das
Code:
  1. logfile.Add('Rocrod an gegnerinfo['+inttostr(buff.LANID)+'] übergeben');

noch ab. Steht also in der Log drinne.

Einer ne Ahnung warum?! Denkfehler?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 16, 2004 11:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
verschickst du auch ein REcord vom Typ TSpieler_Info ??
ansonsten würde ich dir raten das speichern des Logfiles direkt in die Add-Routine zu implementieren, dann musst du nicht soviel tippen...
oder aber du machst ne try finally konstruktion um deinen Code und im finally speicherst du dann den logfile...
oder ist logfile einfach ne stringlist?? :roll: ;)

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 16, 2004 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
ja, stringlist, ist ja nur zum test... ;)
Aber klar verschicke ich auch Tspieler_info, sonst würde das ja nicht gehen können ^^ bzw. dann ist klar das es net geht.

EDIT: kann es sein das es net geht weil ich den record aus ner klasse heraus nehme und wieder reinspeichere? nein oder?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 16, 2004 13:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
hm, zeig mal dei Deklaration von Tspieler_info ...
wenn das selber ne Klasse ist, dann geht es nciht...

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 16, 2004 14:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Code:
  1. Tspieler_info = record
  2.     X, Y, Z, Heading_sicht, heading, auto_kippen, autodrehen: single;
  3.     hinterrad_drehen, vorderrad_drehen, jump: single;
  4.     isbrake: boolean;
  5.     LANID: integer;
  6.     //runden: integer;
  7.   end;
  8.  
  9.   Tarray = array of string;
  10.  
  11.   Tspieler_class = class(TObject)
  12.  
  13.     PROCEDURE Quad_Render();
  14.   private
  15.   //--private dekleration
  16.   public
  17.     Spieler_info: TSpieler_info;
  18.   end;


senden tu ichs mit player01.Spieler_info

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 16, 2004 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Code:
  1. socket.ReceiveBuf(buff,socket.ReceiveLength);

Böse Falle...wenn dann nämlich an deinem Socket mehr Daten anstehen als in dein Tspieler_info reinpassen knallts logischerweise. Also socket.ReceiveLength besser durch SizeOf(TSpieler_Info) ersetzen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]