Autor |
Beitrag |
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 26.03.08 21:51
Buffer ist doch auch nur ein Bereich im Speicher. Und Speicher ist nix andres als ne riesig große Regalwand, wo man sich die Fächer so zusammenbauen kann, wie man se grad brauch
@Warum zuerst in den Speicher vor'm Senden: Müsste Narses eigentlich drin stehen haben ... Kann Dir aber mindestens 3 zusätzliche Gründe nennen:
- Geht schnell
- Datenbündelung
- Vermeidung kleiner Pakete
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
der13geist
Hält's aus hier
Beiträge: 10
Win Vista Ultimate x86
D7 Pro, D2007
|
Verfasst: Mi 26.03.08 22:04
nja also der Code heisst ja eig. so
Delphi-Quelltext 1: 2:
| SetLenght(BinMessage, 4); PInteger(@BinMessage[1])^ := Lenght(Edit1.Text); |
und (da ich es immer noch nicht verstanden habe) ich hätte anstatt so es so geschrieben
Delphi-Quelltext 1:
| BinMessage := Lenght(Edit1.Text); |
Aber dieses würde ja nicht funktionieren.
Habe es leider imer noch nicht verstanden
_________________ 01 05 54 F4
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 26.03.08 23:42
Ähm... es steht doch dran warum:
1. BinMessage ist ein String
2. Die Länge des Strings soll im Binärformat in BinMessage geschrieben werden.
Delphi-Quelltext 1: 2:
| BinMessage := Length(Edit1.Text); BinMessage := IntToStr(Length(Edit1.Text)); |
Und auf Seite 9 noch einmal ganz exakt beschrieben.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
der13geist
Hält's aus hier
Beiträge: 10
Win Vista Ultimate x86
D7 Pro, D2007
|
Verfasst: Do 27.03.08 00:05
AHSOOO
Also ist dieser code eig. nur dazu da die länge des strings in Binär format abzuspeichern !?
_________________ 01 05 54 F4
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.03.08 00:21
Moin!
der13geist hat folgendes geschrieben: | Also ist dieser code eig. nur dazu da die länge des strings in Binär format abzuspeichern !? |
Genau. Das WARUM wird schon in Kapitel 2.3 auf Seite 6 erklärt: Rahmenbildung über Längenzähler
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
der13geist
Hält's aus hier
Beiträge: 10
Win Vista Ultimate x86
D7 Pro, D2007
|
Verfasst: Do 27.03.08 00:28
aber würde ich es beim empfangen nicht in Hex umwandeln würde doch dort (Nun ja, angenommen in Edit1 steht "Hallo Welt") nur das stehen "#0#0#0#10" also dreimal ein Nullbyte und einmal ein Zeichen mit dem ASCII Code von 10 oder ?
_________________ 01 05 54 F4
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.03.08 00:31
Moin!
der13geist hat folgendes geschrieben: | aber würde ich es beim empfangen nicht in Hex umwandeln |
Das machen wir ja nur, um es überhaupt anzeigen zu können.
der13geist hat folgendes geschrieben: | würde doch dort (Nun ja, angenommen in Edit1 steht "Hallo Welt") nur das stehen "#0#0#0#10" also dreimal ein Nullbyte und einmal ein Zeichen mit dem ASCII Code von 10 oder ? |
Nein, auch das wird in Kapitel 2.3 ausführlich erläutert: Intel-CPUs schreiben lsb-first, also steht dort: #10,#0,#0,#0.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
der13geist
Hält's aus hier
Beiträge: 10
Win Vista Ultimate x86
D7 Pro, D2007
|
Verfasst: Do 27.03.08 00:43
Danke mit diesen erkentnissen wird mir höchstwahrscheinlich alles klar. Ich werde dein tutorial noch einmal von anfang an durchlesen.
Ich danke für die Hilfe
MfG
_________________ 01 05 54 F4
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.03.08 00:44
Moin!
Bitte, gern geschehen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Mann_aus_Delphi
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 01.04.08 19:18
Titel: Ie bekomme ich überhaupt die korrekte IP?
Hey,
erstmal herzlichen Dank an Narses für das tolle Tutorial.
Ich habe fleißig gelesen und gebastelt, und getestet.
Auf meinem Lokalen Pc kann ich Verbindungen mit dem PC meines Bruders und dem meiner Mutter aufnehmen, jedoch nicht zu, sagen wir mal meinem Opa hundert Kilometer entfernt.
Ich schätze, dass die lokale IP dafür nicht taugt, aber welche dann? Die öffentliche geht auch nicht, zumindest zeigt er mir einen Verbindungsfehler an. Welche IP muss ich dafür nehmen, und wo bekomme ich sie her?
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 01.04.08 19:26
Dafür gibt es 2 Möglichkeiten:
1. Du nutzt ein VPN wie z.B. Hamachi. In dem Fall kannst Du dann die VPN-IP nutzen.
2. Ansonsten musst Du den entfernten Rechner (also der, der Server spielt) als DMZ konfigurieren (am Router) oder über Port-Forwarding (am Router) nach draußen "weiterleiten" ...
Zu zweiterem hat Narses auch bereits einen Beitrag geschrieben, wie das geht. Ersteres kann ich aus eigener Erfahrung empfehlen
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 02.04.08 00:01
Titel: Re: Ie bekomme ich überhaupt die korrekte IP?
Moin!
Mann_aus_Delphi hat folgendes geschrieben: | erstmal herzlichen Dank an Narses für das tolle Tutorial. |
Danke für das Lob.
Mann_aus_Delphi hat folgendes geschrieben: | jedoch nicht zu, sagen wir mal meinem Opa hundert Kilometer entfernt. |
Hat der, der den Server stellt, einen Router im Einsatz? Dann schau mal hier.
Ansonsten könnte noch eine Firewall-Einstellung die Verbindung verhindern.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Mann_aus_Delphi
Hält's aus hier
Beiträge: 15
|
Verfasst: Mo 14.04.08 14:28
Titel: Noch ne Frage...
Ich den Clienten und den Server jetzt etwas erweitert und würde ihn nun gerne veröffentlichen (natürlich mit Bezug auf diese Seite und Narses Protokoll). Wenn Ihr, vor allem Narses, nichts dagegen habt, würde mich das wirklich sehr freuen!
Mann_aus_Delphi
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 14.04.08 16:23
Solang das Rahmen-Protokoll kompatibel ist (also die Basisstruktur in der Übertragung), seh ich da wenige Probleme ... Außerdem ist ein öffentliches Tut ja dafür gedacht, dass daraus auch neue Anregungen für andre entstehen
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 17.04.08 13:15
Titel: Re: Noch ne Frage...
Moin!
Mann_aus_Delphi hat folgendes geschrieben: | Ich den Clienten und den Server jetzt etwas erweitert und würde ihn nun gerne veröffentlichen (natürlich mit Bezug auf diese Seite und Narses Protokoll). Wenn Ihr, vor allem Narses, nichts dagegen habt, |
Klar habe ich nichts dagegen. Dazu eignet sich die Sparte Open Source Projekte, wenn du den Quelltext dazu tun willst (was ich hiermit vorschlagen möchte ).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Pseudo
Beiträge: 16
Erhaltene Danke: 1
|
Verfasst: Fr 10.08.12 20:54
Sorry, dass ich das hier ausgrabe (Tut mir echt leid!),
aber ich hätte da noch eine Frage:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TNBFPAServer.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin LogIt('! SID:'+IntToStr(ServerPA.ConnectionsBySocket[Socket].SessionID)+ ' Fehler [WSA:'+IntToStr(ErrorCode)+'] aufgetreten! '+Socket.RemoteAddress); if (Socket.Connected) then Socket.Close else DeleteClient(Socket); ErrorCode := 0; end; |
Hier nutzt du zum Disconnecten die Funktion Socket.Close! Wäre es nicht eig. besser hier Die Disconnect Funktion vom PA zu nutzen? bei mir kommt es mit obigem Code manchmal zu einem Fehler O.o mit Disconnect klappts wie geschmiert
Moderiert von Martok: Delphi-Tags hinzugefügt
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 11.08.12 00:08
Moin!
Pseudo hat folgendes geschrieben : | Sorry, dass ich das hier ausgrabe (Tut mir echt leid!),
aber ich hätte da noch eine Frage: |
Dazu ist der Thread da, kein Problem.
Pseudo hat folgendes geschrieben : | Hier nutzt du zum Disconnecten die Funktion Socket.Close! Wäre es nicht eig. besser hier Die Disconnect Funktion vom PA zu nutzen? bei mir kommt es mit obigem Code manchmal zu einem Fehler O.o mit Disconnect klappts wie geschmiert |
Man beachte: wir befinden uns bereits in der Fehlerbehandlung! Die spannendere Frage scheint mir eigentlich zu sein, wie es dazu kommt, dass du an dieser Stelle überhaupt die Notwendigkeit hast, die Verbindung noch trennen zu müssen (idR ist nach einem Fehler der Socket sowieso dicht oder zumindest unbrauchbar). Das Socket.Close ist da eigentlich nur noch Dichtmasse, normalerweise kommt man da gar nicht mehr hin.
Aber, ich gebe zu , das Trennen der Verbindung im Server ist schon immer hakelig gewesen und im Nachhinein bereue ich es etwas, dass nicht per Message gelöst zu haben (es gibt da leider ein paar unschöne Probleme mit der MessageLoop, die kriegt man nicht anders in den Griff).
Warum auch immer es noch (genau genommen nachträglich, weil schon in der Fehlerbehandlung) bei dir zu Fehlern kommt, die ein PA.Disconnect statt einem Socket.Close "heilt", mach es so. An der Stelle kann man eigentlich nicht mehr viel kaputt machen (die Verbindung ist dann sowieso kaputt, sonst wärst du nicht im ErrorHandler gelandet).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Pseudo
Beiträge: 16
Erhaltene Danke: 1
|
Verfasst: Mo 13.08.12 17:02
Ich hab den Ort jetzt gefunden
Wenn der Client mir was sendet und er genau dann per Taskmgr beendet wird kommt es (glaube ich) zu folgendem Problem:
Ich will die Instanz des PA zerstören, habe aber noch was in der Inbound Warteschlange...
Zumindest theoretisch könnte man ja einfach einen try-catch block um die komplette Procedur machen, weil das objekt danach ja eh zerstört wird, oder?
Übrigens danke für das geniale Tutorial, das hätte ich definitiv nicht ohne dich hinbekommen
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 13.08.12 17:55
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Pseudo
Beiträge: 16
Erhaltene Danke: 1
|
Verfasst: So 09.09.12 01:23
Falls man hier auch noch einen Tutorialwunsch äußern kann:
Wie kann ich den Server multithreaden (so, dass der ProtocolAdapter nicht komplett umgeschrieben werden muss)? Ich hab dazu bis jetzt nicht viel im Internet gefunden... Und die Indys kann ich nicht leiden (unter anderem auch weil man nur eine Zeile übertragen kann?!?). Würde mich freuen! Muss ja nicht lang sein, sondern nur kurz erklären wie man es überhaupt macht
Vielen Dank
|
|