Entwickler-Ecke

Internet / Netzwerk - "Screengrabber" über Netzwerk


Andreas Pfau - Sa 19.04.03 11:56
Titel: "Screengrabber" über Netzwerk
Hallo,

ich will mir ein Tool schreiben, das es mir erlaubt, 2 über Ethernet (TCP/IP) vernetzte PCs mit nur einem Monitor zu betreiben.

Ich stelle mir das so vor, dass auf jedem PC das Tool läuft, mehrmals pro Sekunde Screenshots macht, und über Netzwerk an den anderen PC schickt, so dass auf jedem PC am Monitor ein kleines Fenster mit dem Screen des anderen PCs zu sehen ist. Besser gesagt, ist das Fenster des inaktiven PC unsichtbar, damit es nicht auf dem Screenshot erscheint.

Screenshots zu machen ist kein Problem, und ich komprimiere sie dann mit JPEG, auch kein Problem, aber wie versende ich Daten über's Netzwerk, z.B. einen Stream, wie ruft der andere PC die Daten ab? Ich habe so was noch nie gemacht, sonst würde ich ja kein neues Topic posten, bitte helft mir!


FloSch - Sa 19.04.03 12:58

Obwohl ich für solche Aufgaben eher die Indy-Komponenten verwenden würde ([url]http://www.nevrona.com/indy[/url]; Beispiel ist dabei):

http://www.delphi-forum.de/viewtopic.php?t=2632

Grüße
Florian


Andreas Pfau - Sa 19.04.03 14:08

Das mit den Sockets ist toll, sieht einfach aus.

aber was sind das für Kompos? Also wie heißt diese Socket-Kompo, welche Parameter muss ich wie setzen?


FloSch - Sa 19.04.03 14:14

Andreas Pfau hat folgendes geschrieben:
aber was sind das für Kompos? Also wie heißt diese Socket-Kompo, welche Parameter muss ich wie setzen?


Client: TClientSocket
Server: TServerSocket

Was meinst du mit Parameter? Steht alles in dem Tutorial.

Grüße
Florian


DeCodeGuru - Sa 19.04.03 14:17

Normalerweise findet man die in der Internet-Sparte aber seit Delphi 7 findet man diese dort nicht mehr. Allerdings kann man diese dort trotzdem noch verwenden. Man muss nur die Unit einbinden und die dann per Hand erstellen und das geht natürlich genauso gut :)


FloSch - Sa 19.04.03 14:20

In Delphi 7 findet man meines Wissens eine Art

TTCPServer und TTCPClient (oder so ähnlich :P )

Grüße
Florian :roll:


Andreas Pfau - Sa 19.04.03 14:44

Yep, vielen Dank!

Aber @FloSch: Die Parameter stehen N-I-C-H-T im tutorial. da steht nur was von socktes. Was muss ich einstellen bei:
BlockMode
LocalHost
LocalPort
RemoteHost
RemotePort


FloSch - Sa 19.04.03 14:55

Andreas Pfau hat folgendes geschrieben:
Yep, vielen Dank!
BlockMode
LocalHost
LocalPort
RemoteHost
RemotePort


Ach Eigenschaften meinst du - das sind aber keine Parameter (oder irre ich da?! :? )!

Was für eine Komponente ist das (btw: einfach mal F1 auf die Komponente für die Online-Hilfe ;) Dort findest du auch die Erklärung der Parameter.)?

Grüße
Florian :roll:


wulfskin - Sa 19.04.03 15:15

FloSch hat folgendes geschrieben:
Ach Eigenschaften meinst du - das sind aber keine Parameter (oder irre ich da?! :? )!

Was für eine Komponente ist das (btw: einfach mal F1 auf die Komponente für die Online-Hilfe ;) Dort findest du auch die Erklärung der Parameter.)?

Grüße
Florian :roll:
Hallo Florian,

du brauchst nicht die Augen rollen ;), denn es gibt gar keine Hilfe zu den Sockets, in der man nachschauen könnte.
Ich versuch mal soviel zu erklären, wie ich vom Netzwerk weiss:Ich hoffe das hilft!

Gruß wulfskin!


FloSch - Sa 19.04.03 15:22

Hallo,

wulfskin hat folgendes geschrieben:
du brauchst nicht die Augen rollen ;), denn es gibt gar keine Hilfe zu den Sockets, in der man nachschauen könnte.


definitiv falsch! :arrow: Bei mir (D5 Prof) existiert zu TServer- und TClientSocket ein Eintrag in der OH.

Auszug aus der OH für Host:
Online Hilfe hat folgendes geschrieben:

Die Eigenschaft Host ist ein Alias für die IP-Adresse des Server-Systems.

property Host: string;

Host ist ein String, der den Domänennamen und den Dienst eines bestimmten Systems enthält, wie z.B.:
http://www.wSite.Com


Zitat aus der OH für Port:
Online Hilfe hat folgendes geschrieben:

Die Eigenschaft Port enthält die ID, die zur Bezeichnung der Server-Socket-Verbindung benutzt wird.

property Port: Integer;

Mit Hilfe von Port-IDs kann ein einzelnes System, das über die Eigenschaft Host oder Address bezeichnet wird, als Host für mehrere Verbindungen gleichzeitig fungieren. Viele Port-IDs sind per Konvention mit einem bestimmten Dienst (z.B. ftp oder http) verknüpft.


Grüße
Florian :roll:


Andreas Pfau - Sa 19.04.03 15:29

Sorry, ja, propertys meine ich.

OK, aber woher weiß ich, welcher Port frei ist???
Und woher weiß ich, welche IP ich verwenden muss???

Ihr müsst wissen, ich habe Nil^ Ahnung von Netzwerk!


FloSch - Sa 19.04.03 15:35

Hallo,

Andreas Pfau hat folgendes geschrieben:
OK, aber woher weiß ich, welcher Port frei ist???
Und woher weiß ich, welche IP ich verwenden muss???


Du kannst jeglichen Port > 1024 benutzen.
Bei Host (IP) gibst du den Zielrechner an, mit dem du dich verbinden willst.

Unter Windows 98 erfährst du die IP folgendermaßen:
Start -> Ausführen -> winipcfg

Unter Windows 2000 und höher in den Netzwerkeigenschaften.

Grüße
Florian :roll:


Andreas Pfau - Sa 19.04.03 15:40

OK, nur dass ich richtig verstandne habe:

Also Host nehme ich eine X-Beliebige Zahl, z.B. 2345

Für Host lasse ich den User die IP eintippen. Oder gibt's 'nen API-Call, der das für nich macht, oder zumindest 'ne Liste mit allen vernetzten PCs erstellt, dass der User wählen kann?


FloSch - Sa 19.04.03 15:48

Andreas Pfau hat folgendes geschrieben:
Also Host nehme ich eine X-Beliebige Zahl, z.B. 2345


Wenn du anstatt Host da noch Ping einfügst stimmts (bis maximal 65535 glaube ich)! :lol:

Andreas Pfau hat folgendes geschrieben:

Für Host lasse ich den User die IP eintippen.


Korrekt.

Andreas Pfau hat folgendes geschrieben:

Oder gibt's 'nen API-Call, der das für nich macht, oder zumindest 'ne Liste mit allen vernetzten PCs erstellt, dass der User wählen kann?


Hmmm, schau mal auf [url]swissdelphicenter.ch[/url]. Ich glaube da gab es mal ein Beispiel.

Grüße
Florian


Andreas Pfau - Sa 19.04.03 16:49

@FloSch:
Zitat:
Wenn du anstatt Host da noch Ping einfügst stimmts

Du meinst nicht Ping, sondern Port, gell?

OK, aber das nächste Problem wartet. Ich habe die Routine, die die Screenshots macht. Warum ist die so lahm? Es gibt doch professionelle Backdoors, die das gleiche machen, sind die auch so lahm? Das ruckelt ohne Ende. Wer kennt als eine schnelle Methode, einen Screenshot zu machen, und das ganze zu resizen?


FloSch - Sa 19.04.03 16:58

Andreas Pfau hat folgendes geschrieben:

Zitat:
Wenn du anstatt Host da noch Ping einfügst stimmts

Du meinst nicht Ping, sondern Port, gell?

Argh! Ja klar - sorry :lol:

Andreas Pfau hat folgendes geschrieben:

OK, aber das nächste Problem wartet. Ich habe die Routine, die die Screenshots macht. Warum ist die so lahm? Es gibt doch professionelle Backdoors, die das gleiche machen, sind die auch so lahm? Das ruckelt ohne Ende. Wer kennt als eine schnelle Methode, einen Screenshot zu machen, und das ganze zu resizen?


Ich glaube nicht das die Backdoors jedes mal Screenshots erstellen, sondern einen anderen Algorithmus anwenden oder? Ansonsten lager das Screenshot erstellen in einen eigenen Thread aus.

Grüße
Florian :roll:


Andreas Pfau - Sa 19.04.03 17:01

Feine, Sache, so ein thread, aber irgendwo ist der Wurm drin. Es Ruckelt trotzdem. Daran tüftle ich schon seit Stunden. Muss halt den Fehelr suchen.


Andreas Pfau - Sa 19.04.03 21:53

Juhu, ich hab's! Ich habe es so gelöst, dass ich immer nur kleine Rects (1% des gesamtne Screens) übertrage, und so den Screenshot "Stückchenweise" aktualisiere. Das langt für meine Zwecke. So kann ich auch den Traffic regulieren, denn ich habe nur eine 10MBit-Verbindung :roll:


wulfskin - So 20.04.03 02:11

Andreas Pfau hat folgendes geschrieben:
OK, aber das nächste Problem wartet. Ich habe die Routine, die die Screenshots macht. Warum ist die so lahm? Es gibt doch professionelle Backdoors, die das gleiche machen, sind die auch so lahm? Das ruckelt ohne Ende. Wer kennt als eine schnelle Methode, einen Screenshot zu machen, und das ganze zu resizen?
Vor langer, langer Zeit, da gab es noch das alte DF ;), hatte wir das Thema schonmal. Als Ergebnis kam heraus, dass die Übertragung in Echtzeit nur möglich ist, wenn man alle Messages weiterleitet und dann entsprechend auswertet. Zu damaliger Zeit wusste keiner wie dies funktioniert und deshalb hatte man auch keine Lösung gefunden. Vielleicht hast du ja diesesmal Glück ;)!
Aber interessantes Thema!

FloSch hat folgendes geschrieben:
definitiv falsch! Bei mir (D5 Prof) existiert zu TServer- und TClientSocket ein Eintrag in der OH.
Dann muss ich mich entschuldigen. Bei mir D5 STD gibt es leider keine Hilfe dazu. Wurde wohl vergessen :(.

Gruß wulfskin!


Andreas Pfau - So 20.04.03 11:42

Hallo nochmal,

ich komme grade an den Netzwerkpart im code. Da ich mich damit wie gesagt kaum auskenne, habe ich auf meiner HDD rumgestöbert und ein Beipsile (Delphi\Demos\Internet\NetChat) gefunden. Aber warum haben die als Host "Localhost" eingetragen? Ich denke, dass muss eine IP sein? Oder kann man da auch den Namen des PCs eintragen (meine heißen PC1 und PC2)??? Oder ist das nur eine "Vorgabe", damit ich die IPs eintippen kann?


FloSch - So 20.04.03 12:04

Hallo,

du hättest meinen Post oben besser lesen sollen.

Nochmal der gleiche Auszug aus der OH:
Zitat:

Die Eigenschaft Host ist ein Alias für die IP-Adresse des Server-Systems.

property Host: string;

Host ist ein String, der den Domänennamen und den Dienst eines bestimmten Systems enthält, wie z.B.:
http://www.wSite.Com


Das heisst: Solange der Netzwerkname von einem DNS-Server aufgelöst werden kann (umgewandelt wird in eine IP) kannst du natürlich auch bei Host z.B. auq.de oder localhost (localhost ist der lokale Rechner; die IP für localhost lautet immer: 127.0.0.1 bis 127.0.0.255) eingeben. Solltest du keinen DNS Server besitzen, der dir die Hostnamen auflösen kann, wirst du wohl oder übel auf IP Adressen zurückgreifen müsse.

Windows verwaltet über sein hauseigenes Protokoll alle Hostnamen, welches es findet. D.h. du kannst auch selber bei Host z.B. einen Netzwerknamen (solange er in der gleichen Subnetmask ist; Std.: 255.255.255.0) aus deiner Windowsumgebung dort eintragen. Windows wandelt den Namen intern dann in die korrekte IP Adresse um, sodass ein Zugriff erfolen kann.

Ich hoffe ich habe dir nun weitergeholfen! :lol:

Grüße
Florian :roll:


Andreas Pfau - So 20.04.03 13:05

Ja, hast du, Danke :D


Dookie - Di 22.04.03 01:41

Vorweg: localhost ist IMMER gleichzusetzen mit 127.0.0.1, was grundsätzlich der EIGENE PC ist!

Du musst nun also die Struktur verstehen in diesem Beispiel!

Ich beschäftige mich auch schon seit langem mit Sockets für ein Chatsystem, und habe auch das von dir genannte Beispiel als Vorlage genommen, nagut sagen wir als Inspiration... ;)

Es ist so: Es wird in diesem Tool ein ServerSocket geöffnet, welcher dann mehrere connects von ClientSockets annehmen kann...

Einer der Leute muss nun also sozusagen den ChatMaster machen...
Wenn man zu diesem verbindet, dann wird der ServerSocket im Progamm nicht genutzt...
Wenn man aber diese "Anlaufstelle" der Chatrunde darstellt, macht man nur den ServerSocket auf und connected gleichzeitig mit seinem ClientSocket zusätzlich an den gestarteten ServerSocket, um an seiner eigenen Chatrunde teilzunehmen sozusagen!

Der Clou hierbei ist nun also, dass man als ChatMaster eine interne Verbindung vom ClientSocket zum ServerSocket herstellt, deshalb die Benutzung von localhost bzw. 127.0.0.1 !!


Andreas Pfau - Di 22.04.03 16:12

Ah... Verstanden, Danke! :D


focus - Do 24.04.03 08:36

localhost ist ein "platzhalter" für deine eigene ip genauso wie 127.0.0.1
gruss
michael

hmmm da war ich wohl zu langsam.....


MaxiTB - Do 24.04.03 11:28
Titel: In den Beispielen ...
... wurde local host (128.0.0.1) verwendet, weil du dann Server/Client auf dem selben Rechner laufen lassen kannst - sowas ist sehr praktisch bei Beispielen.

Wenn du allerdings eine normale Situation hast, also Server <> Client, dann mußt du auf jeden Fall die IP der Gegenstelle angeben. Voila.

Uuups --- wurde ja schon gesagt ... *peinlich sei*


Jebaz - Do 02.10.03 16:27
Titel: Sodeli
Wir Schweizer sind ja bekanntlich sehr genau....Und jetzt übertragt das mal auf eine IT-Ausbildung (die ich absolviere)

Richtig! Ich sollte verdammt viel über Netzwerk bescheid wissen, was ich jetzt aber nicht behaupten möchte ;-)

Also, ich musste ein halbes Jahr mit viel schweiss und blut alles selber rausfinden über diese Sockets (hab auch keinen Eintrag in der Hilfe)

Host - Kann irgendein ansprechbarer Computername oder eine IP sein..im Property RemoteAdress muss es eine IP sein ;-) Nun, deshalb schreiben diese Fritze auch "localhost" dort hinein was soviel heisst wie "MeinRechner". Nach dem Kompilieren wird daraus schon eine IP (schliesslich funktioniert TCP/IP und das ist das gesamte Internet und alles, nur mit IP's und nicht mit Computernamen)

Aus localhost wird dann die IP 127.0.0.1 oder so (sagt mir wenn ich fehler mache, schreib das alles aus dem Kopf) Das muss dich jetzt weiter nicht stören.

Also, bei all diesen Socket-Programmen muss irgendwo im Netzwerk ein Server laufen, der auf die Anfragen reagiert, und auf einem bestimmten Port "horcht"...Nun, du wirst diesen Server erst Programmieren müssen (schreib einfach eine Anwendung mit einem ServerSocket und vergebe diesem eine beliebige Nummer als Port) dann wirst du ihn auf einem Rechner starten und schwups, dieser Rechner gibt dir jetzt auch den Namen vor, den die Clients bei Host eintragen müssen...Also mein PC zu Hause heisst z.B. "Quantenbloedi" also kannst du auch genauso "Quantenbloedi" einschreiben, oder die IP (z.B. "192.168.1.1")

Soweit sogut, nun solltest du mit deinem Client auf den Server connecten können.

Noch was zu den Ports: Das sind quasi die Türen deines PC's.....

Also, die IP-Adresse ist sowas wie die Strasse und die Hausnummer zu deiner Wohnung...Der PC ist aber eine ganz kuule Wohnung, nämlich hat diese 65'536 Türen ;-) Wobei sehr sehr viele dieser Türen einen bestimmten Zweck haben....1-1024 sind besetzt...z.B. Port 80...kommt was auf Port 80 in den PC rein, weiss dieser sogleich "Aha, das ist HTTP, dass muss ich mit einem Browser öffnen.." tja so geht das mit den meisten...und jetzt schreibst du eben einen neuen Server, der auf einem hohen Port am besten horcht, und der PC weiss...Aha, Port x geht auf dieses kuule Printscreen-Progi ;-)

Tja...währe da noch was? Ja, ich glaub schon, hab langsam das gefühl, das bringt dich doch noch nicht weiter...Das zu übertragen ist eben doch noch verdammt schwierig...da du einen FileStream kreiren musst....das synchron hinzukriegen ist so eine Sache für sich...hab das nie geschafft, aber in einem Buch, dass so herumliegt in meiner Firma hier, steht genau alles drinn, wie man Printscreens mit diesen Sockets übertragen kann....werd das mal anschauen und meine Lösung dann posten ;-)


Jebaz - Do 02.10.03 16:27
Titel: Sodeli
OOPs, hab gar nicht gesehen dass das zwei Seiten sind zu diesem Thema und ihr coolen Typen alles schon gesagt habt :shock: sorry....da steht zwar edit "bearbeiten oder löschen" aber löschen krieg ich nicht hin....währe vieleicht noch kuul wenn das schon hinschreibt, dass man dann auch einen Button für das integriert (oder bin ich so stroooooblöd :D ?)