| Autor |
Beitrag |
pyr0t0n
      
Beiträge: 24
|
Verfasst: Di 19.06.07 19:36
Aloa,
ich habe ne kleine Frage. Wie kann ich eine TStringList per Socket Komponenten übertragen? und auf der Anderen Seite wieder in einem TStringList bzw einer ListBox darstellen ?
hat da einer ne idee zu ?
Danke schonmal
Mfg
pyr0
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 19:48
Moin!
Schau mal hier  damit solltest du weiter kommen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 19:54
Also erstmal DANKE
aber gibts da auch ne einfachere möglichkeit ohne gleihc ein Protokoll zu entwerfen? also konnte die TStrings nun in einen TStream umwanden und senden geht ja dann mit Socket.SendStream doch der empfang auf der anderen seite macht mir noch probs.
gruß
pyr0
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 19:58
Moin!
pyr0t0n hat folgendes geschrieben: | | Also erstmal DANKE |
Bitte.
pyr0t0n hat folgendes geschrieben: | | aber gibts da auch ne einfachere möglichkeit ohne gleihc ein Protokoll zu entwerfen? |
IMHO - nein.
pyr0t0n hat folgendes geschrieben: | | also konnte die TStrings nun in einen TStream umwanden und senden geht ja dann mit Socket.SendStream doch der empfang auf der anderen seite macht mir noch probs. |
Genau, deshalb solltest du mal hier und hier nachlesen  warum das so ist.
Eine Alternative wären die TNBFPA-Komponenten, damit kannst du dir das ganze Protokoll-Geraffel vom Hals halten und dich auf das Andere konzentrieren. Hier ein Beispiel, wie einfach es damit ginge:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, NarsesBFPA, StdCtrls;
const CMD_ListBox = 1;
type TForm1 = class(TForm) ListBox1: TListBox; ListBox2: TListBox; Button1: TButton; NBFPAClient1: TNBFPAClient; NBFPAServer1: TNBFPAServer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure NBFPAServer1ClientExecute(Sender: TObject; PA: TProtocolAdapter); procedure FormClose(Sender: TObject; var Action: TCloseAction); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin NBFPAServer1.Open; Application.ProcessMessages; NBFPAClient1.Connect; end;
procedure TForm1.Button1Click(Sender: TObject); var Cmd: TCmdSeq; begin Cmd := TCmdSeq.Create(CMD_ListBox); Cmd.Add(ListBox1.Items); NBFPAClient1.SendAndFree(Cmd); end;
procedure TForm1.NBFPAServer1ClientExecute(Sender: TObject; PA: TProtocolAdapter); var i: Integer; begin case PA.CurrentToken of CMD_ListBox: begin ListBox2.Clear; for i := 1 to PA.CurrentArgCount-1 do ListBox2.Items.Add(PA.Inbound.Strings[i]); end; end; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin NBFPAClient1.Disconnect; Application.ProcessMessages; NBFPAServer1.Close; end;
end. |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Di 19.06.07 20:15, insgesamt 1-mal bearbeitet
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 20:14
Naja vllt sollte ich mein prob doch nochmal weiter erläutern,
also ich habe mehrere Clienten auf denen ich die Windows Prozess liste abrufen kann das geschieht über diese Funktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure GetProcessList(const aProcessList: TStrings); var Snap: THandle; ProcessE: TProcessEntry32; begin aProcessList.Clear; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessE.dwSize := SizeOf(ProcessE); if Process32First(Snap, ProcessE) then Repeat aProcessList.Add(ProcessE.szExeFile); Until not Process32Next(Snap, ProcessE) else RaiseLastOSError; finally CloseHandle(Snap); end; end; |
aufrufen halt über:
Delphi-Quelltext 1:
| GetProcessList(ProzessListe); |
wobei ich ProzessListe vorher schon so deklariert habe
Delphi-Quelltext 1:
| var ProzessListe: TStrings; |
sodale soweit so gut.
Aufdem Server Rechner soll halt diese Liste in einer ListBox wieder angezeigt werden. Und in der übertragung sowie auswertung liegt nun mein problem.
Das Tutorial mit dem Terminator Trennzeichen ist ja nicht schlecht hab mit die Funktion mit dem Senden der UserListe angesehen, aber
ich habe ja bei meiner Tstring überhaupt nicht die erweiterung von .Items geschweige denn .CommaText.
Somit steh ich wieder auf dem schlauch.
Gruß
pyr0
PS: Manch einer mag vllt denken das das hier für einen Trojaner Selbstbau ist dem muss ich aber verneinen das programm soll auf einer LAN zum einsatz kommen und ich möchte cheatern etwas vorbeugen indem ich mir bei Report deren Prozessliste ansehen kann.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 20:17
Moin!
pyr0t0n hat folgendes geschrieben: | wobei ich ProzessListe vorher schon so deklariert habe
Delphi-Quelltext 1:
| var ProzessListe: TStrings; | |
Laut DOH soll man TStringsnicht direkt instanziieren!  Also besser TStringList!
Ansonsten siehe mein letzter Beitrag.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 20:36
Also selbst wenn ich aus TString dann TStringList mache habe ich dieses .Items nicht!?! mache ich denn was falsch ?
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 20:40
Moin!
pyr0t0n hat folgendes geschrieben: | | Also selbst wenn ich aus TString dann TStringList mache habe ich dieses .Items nicht!?! mache ich denn was falsch ? |
Jain TStringListist ein Nachfahre von TStrings, genau so wie z.B. TListBox.Itemsein Nachfahre von TStringsist. Also hat TStringListschon die Eigenschaften .CommaText, .Text, etc.pp.  Schau doch mal in die DOH...
Auf das TNBFPA-Beispiel oben bezogen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; Cmd: TCmdSeq; begin SL := TStringList.Create; try SL.Add('Test1'); SL.Add('Test2'); Cmd := TCmdSeq.Create(CMD_ListBox); Cmd.Add(SL); NBFPAClient1.SendAndFree(Cmd); finally SL.Free; end; end; |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 20:51
also die funktion sieht bei mir nun so aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| GetProcessList(ProzessListe); try Cmd := TCmdSeq.Create(CMD_ListBox); Cmd.Add(ProzessListe); NBFPAClient1.SendAndFree(Cmd); finally ProzessListe.Free; end; end; |
doch sobald die im client aufgerufen wird bekomme ich
Access violation at address 00458A78 in module 'Client.exe' Read of address 00000000.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 20:55
Moin!
pyr0t0n hat folgendes geschrieben: | also die funktion sieht bei mir nun so aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| GetProcessList(ProzessListe); try Cmd := TCmdSeq.Create(CMD_ListBox); Cmd.Add(ProzessListe); NBFPAClient1.SendAndFree(Cmd); finally ProzessListe.Free; end; end; |
doch sobald die im client aufgerufen wird bekomme ich
| Debugger hat folgendes geschrieben: | | Access violation at address 00458A78 in module 'Client.exe' Read of address 00000000. |
|
Das darfst du natürlich nur dann tun, wenn deine Prozessliste eine lokale Variable ist; wenn die Liste global ist, dann gibst du sie ja entweder zu früh bzw. mehrfach frei  und das gibt natürlich was auf die Finger.
Aber mal so am Rande: du meinst nicht, dass ein oder zwei OOP-Tutorials dir gut tun würden...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 20:57
| Zitat: |
Aber mal so am Rande: du meinst nicht, dass ein oder zwei OOP-Tutorials dir gut tun würden...
|
joa bestimmt aber mache delphi eigentlich nur wenn ich schnell was brauche lerne atm c++ ^^
EDIT:
Also habe das Free rasgenommen fehler bleibt allerdings.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 21:05
Moin!
pyr0t0n hat folgendes geschrieben: | | Also habe das Free rasgenommen fehler bleibt allerdings. |
Mehr Code, bitte.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 21:12
kk kommt...
Also nochmal die Funktion GetProcessList
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure GetProcessList(const aProcessList: TStringList); var Snap: THandle; ProcessE: TProcessEntry32; begin aProcessList.Clear; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessE.dwSize := SizeOf(ProcessE); if Process32First(Snap, ProcessE) then Repeat aProcessList.Add(ProcessE.szExeFile); Until not Process32Next(Snap, ProcessE) else RaiseLastOSError; finally CloseHandle(Snap); end; end; |
Dann nochmal der Teil der mir die Liste senden soll, es muss an einem der 2 Sachen liegen, weil der fehler auftritt sobald ich den Button zum senden drücke.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var antwort : STRING; var Cmd: TCmdSeq; begin antwort := Socket.ReceiveText;
[...]
if antwort = 'PROZLIST' then begin GetProcessList(ProzessListe); try Cmd := TCmdSeq.Create(CMD_ListBox); Cmd.Add(ProzessListe); NBFPAClient1.SendAndFree(Cmd); finally; end; end; |
hoffe des reicht dir weil viel mehr hab ich gar nicht. und auhc nix was irgendein Free hat ^^
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 22:07
Moin!
pyr0t0n hat folgendes geschrieben: | Dann nochmal der Teil der mir die Liste senden soll, es muss an einem der 2 Sachen liegen, weil der fehler auftritt sobald ich den Button zum senden drücke.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var antwort : STRING; var Cmd: TCmdSeq; begin antwort := Socket.ReceiveText;
[...]
if antwort = 'PROZLIST' then begin GetProcessList(ProzessListe); try Cmd := TCmdSeq.Create(CMD_ListBox); Cmd.Add(ProzessListe); NBFPAClient1.SendAndFree(Cmd); finally; end; end; | |
 Ähm, das sieht so aus, als hättest du da die Komponenten "vermischt"?!  Also, du darfst NUR die TNBFPA-Kompos ODER die Sockets direkt nehmen, nicht beides durcheinanderbringen!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Di 19.06.07 22:12
hm.. doch habs hinbekommen
und zwar hab ich einfach beim Clienten der die ProzessListe senden soll eine ListBox gemacht welche halt unsichtbar ist, dort hatte ich dannauch die funktion Items und komischerweise gehts nun auch..
trotzdem nochmal vielen dank.
aber eine frage hab ich noch...
wie kann ich mit deinen kompos normalen text senden und diesen auswerten ala
wenn gesendeter text = blubb mache das und das
über normale sockets ja
socket.sendtext(STRING) und Socket.ReceiveText
aber wie bei deinen ?
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.06.07 22:29
Moin!
pyr0t0n hat folgendes geschrieben: | | und zwar hab ich einfach beim Clienten der die ProzessListe senden soll eine ListBox gemacht welche halt unsichtbar ist, dort hatte ich dannauch die funktion Items und komischerweise gehts nun auch. |
 ich fürchte, du hast keine Ahnung, was du da machst...  oder?
pyr0t0n hat folgendes geschrieben: | | trotzdem nochmal vielen dank. |
Bitte bitte, aber lies dir einfach mal die Protokoll-Tuts durch, ja?
pyr0t0n hat folgendes geschrieben: | aber eine frage hab ich noch...
wie kann ich mit deinen kompos normalen text senden und diesen auswerten ala |
Das läuft bei den TNBFPA-Kompos nicht über Text, sondern über die Kommando-Token (diese const CMD_ListBox = 1; Geschichte), dafür brauchst du keinen Text.  Bitte Details im BinProto-Tut nachlesen.
pyr0t0n hat folgendes geschrieben: | wenn gesendeter text = blubb mache das und das
über normale sockets ja
socket.sendtext(STRING) und Socket.ReceiveText |
So wie du das ansetzt, ist das eh "falsch", weil du von den Ereignissen nicht auf Datenpaketgrenzen schließen kannst/darfst, das klappt immer nur "zufällig", Details hier. Weiterhin bekommst du Probleme, wenn die Datenrate so hoch wird, dass der WSA-Puffer voll läuft, dann liest du mit einem Socket.ReceiveText nämlich immer nur 8kb, und nicht alles, was bisher eingetroffen ist!  Insgesamt also: besser Finger von lassen und ein Protokoll nehmen (was mit den TBNFPA-Kompos ja nun wirklich ein Kinderspiel ist, einfach für die Befehle Konstanten definieren und die Parameter an die Sequenz hängen, fertig. Den TClientSocket und den TServerSocket brauchst du dann gar nicht mehr im Projekt.  )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pyr0t0n 
      
Beiträge: 24
|
Verfasst: Mi 20.06.07 18:08
ok Narses eine letzte frage hab ihc aber noch in deinem Code / PDF sendet der Server nur an alle Clienten, was ist wenn ich ein bestimmtes Commando nur an EINEN clienten senden will den ich vorher auf ner ListBox auswähle? also das mit der Listbox krieg ich hin aber das senden an sich an nur einen Clienten.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 20.06.07 18:20
Moin!
pyr0t0n hat folgendes geschrieben: | | in deinem Code / PDF sendet der Server nur an alle Clienten, |
Das stimmt nicht ganz  hier wird nur an einen was gesendet (den "Neuen"; Auszug aus dem Demo-Code):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TServerMain.NBFPAServer1ClientConnect(Sender: TObject; PA: TProtocolAdapter); var Cmd: TCmdSeq; i: Integer; begin for i := 0 to NBFPAServer1.Connections.Count-1 do if (NBFPAServer1.ConnectionByIndex[i] <> PA) then begin Cmd := TCmdSeq.Create(CMD_USERDATA); Cmd.Add(NBFPAServer1.ConnectionByIndex[i].SessionID); Cmd.Add(NBFPAServer1.ConnectionByIndex[i].SessionName); PA.Outbound.AddCmdAndFree(Cmd); end; end; |
pyr0t0n hat folgendes geschrieben: | | was ist wenn ich ein bestimmtes Commando nur an EINEN clienten senden will den ich vorher auf ner ListBox auswähle? |
Konkret auf deinen Fall angepasst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var Cmd: TCmdSeq; begin Cmd := TCmdSeq.Create(... blah; NBFPAServer1.ConnectionsByIndex[i].Outbound.AddCmdAndFree(Cmd); NBFPAServer1.ConnectionsByIndex[i].Send; |
Damit wird das Kommando an die i-te Verbindung gesendet.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|