Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Dateiaustausch per LAN


  • Please log in to reply
24 replies to this topic
fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Hallo zusammen,

ich weiß nicht ob sowas mit AHK zu machen ist, denke aber schon. Habe schon ein paar Chat Scripts gefunden und mir diese angeschaut aber nicht so wirklich verstanden.

Ich brauche einen Tutor der sich die Mühe macht und mich da heran führt. Ich weiß das ist viel verlangt, vllt. möchte sich aber jemand dieser Aufgabe annehmen.

Was ich machen möchte:

1. Jeder Client sollte auch gleich Server sein. Ich möchte vermeiden das es einen Zentralen Server gibt.

2. Über das TrayMenü kann man dann eine GUI öffnen. In der GUI stehen die Namen der Clients. Dies sollte so sein das von jedem Client der Online geht zwei Daten angezeigt werden, der Username des Clients ist = A_UserName und der Display Name = "Frei vom User wählbar". Nun angenommen 40 Clients gehen Online dann hätte ja jeder 40 Namen in der Liste. Das wird unübersichtlich. Es wäre daher schön wenn man einen Konfigeditor hätte der es ermöglicht 5 Listen anzulegen. Dort kann man den Namen der Liste angeben sowie UserNamen eintragen. Alle Namen die nicht in einer der 5 Listen auftauchen kommen in die Liste "Other online user". Das alles in einer Listbox die sich selbst aktualisiert. Logischerweise werden nur die Namen angezeigt die auch Online sind.

3. Klickt man einen Kontakt an so kann man wählen zwischen Nachricht und Bildversand. Bei Nachricht öffnet sich ein kleines Chatfenster ohne viel tamtam, nur auf Text begrenzt. Bei Bildversand greft dann ein Screenshotscript. Der erstellte Screenshot wird dann an den anderen Client versendet. Bei erfolgreichem Empfang wird das Bild geöffnet. Aber nicht direkt in den Vordergrund. Es sollte minimiert in der Taskleiste öffnen und erst beim Klick darauf angezeigt werden. Alle Bilder die ein Sender an diesen Client schickt landen in einem Ordner (name = UserName des Senders). Zum Anzeigen könnte der Windows Photo Viewer verwendet werden. Wir nutzen hier alle Windows 7 Rechner dieser ist also bei allen vorhanden. eine Lösung per GUI wäre aber auch gut.

Soweit meine Vorstellung...

Ich möchte wirklich nichts vorgekaut haben, ich will lernen und mit dem geschreibenen auch klar kommen. Ich wills verstehen und auch modifizieren können. Ich brauche sicherlich hier und da denkanstöße, ich hab schon einige erfahrung mit AHK gesammelt aber wenns tiefer geht (DllCall etc) dann hörts leider auf. Ich hoffe dies hiermit ändern zu können.

Ich würde mir wünschen das es als Comunity-Projekt vllt. auch andere brauchen können und mitmachen.

Ich hoffe auf Resonanz Posted Image

Vielen Dank fürs Mitlesen!

MfG
fump

Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Cooles Projekt, aber ich hab leider selbst keine Ahnung vom Netzwerk Scripting.
Wenn du sagst, dass du schon ein bisschen auf dem Gebiet erkundigt hast, kennst du Bentschis TCP & UDP Library vielleicht schon.
Ich vermute mal diese Lib ist genau was du brauchst, es sei denn es gibt irgendwas neueres, nur bräuchtest du halt einen der dir erklärt wie man sie anwendet...

Das erforderliche Hintergrundwissen über lokale Netzwerke in Bezug auf Struktur, Protokolle usw. hast du ja hoffentlich, wenn du dir sowas vornimmst...

Find the recent autohotkey version here: ahkscript.org


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
Hi,
ein nettes Tool (das bei mir aber nicht auf jedem Rechner voll funktionierte) ist udp-lan-chat von Bentschi
http://www.autohotke...d78e7d46b165867
(atm, direkter Link 404)
Vllt kannste das ja für deine Zwecken ein bisschen aufbohren.
Regards,
Babba

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Das erforderliche Hintergrundwissen über lokale Netzwerke in Bezug auf Struktur, Protokolle usw. hast du ja hoffentlich, wenn du dir sowas vornimmst...

Jepp, das ist vorhanden. Die LIB von Bentschi hab ich mir schon angeschaut aber wie man damit nun die wünsche umsetz... keine ahnung :(

Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Also ich habe mich ein bisschen damit beschäftigt, eigentlich ist die Lib ja relativ verständlich...
Ich muss selbst ein bisschen rumexperimentieren, vorallem bei der Verwendung von Callbacks, wenn ich so einigermaßen den Dreh raushab werd ich nochmal bescheid sagen und dir erklären was ich verstanden habe, aber ich würde dir trotzdem empfehlen dich einfach mal selbst mit der Lib zu beschäftigen. Versuch doch mal die Beispiele zu testen, ändere die Adressen usw...

Find the recent autohotkey version here: ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
http://www.autohotke...-winsock-tcpip/

Das klingt auch interessant. Ich kann das Gedanklich nachvollziehn wie das funktioniert. Ich werd mir das mal genauer anschauen.

EDIT:
Leider kommt man an die Beispiele und Scripts nicht mehr dran. Sind dem Hack zum Opfer gefallen... Schade das man die Daten nicht wiederherstellen konnte.

Bleib ich also doch bei der LIB von Bentschi.

ruespe
  • Members
  • 567 posts
  • Last active: Dec 01 2014 07:59 PM
  • Joined: 17 Jun 2008
Du musst nicht gleich aufgeben, sondern auch mal ganz nach hinten blättern im Thread. Da findest du dann z.B. diesen Link: http://pastebin.com/3Lg0D7e7

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Ja, aber ist das auch die Unicode-Version oder nur die ANSI? In wie fern macht das nen unterschied? Bisher mach ich alle Scripts auf UTF8 und nutze sie mit AHK_L.

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Ich hab mir nun beide LIBs angeschaut, okay ich weiß wie ich eine Verbindung aufbaue... aber was kommt danach? Ich brauch wirklich jemanden der mir das Thema nahe bringen kann. Der mir erklären mag was hier passiert und wie ich vorgehen muss.

Ich bitte euch, helft mir!!! Ich will das unbedingt schaffen...

MfG
fump

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Also um eine Datei im Internet von A nach B zu schicken brauchst du entweder einen Server oder musst irgendwie die globale IP-Adresse des Punkts B rausfinden also besitzt Punkt B immer wieder die Gleiche Ip Adresse oder du kannst da ganze vergessen
Du könntest natülich auch eine Facebook nachicht oder eine Email an Empfänger B schicken mit deiner IP Adresse.
Falls du tatsächlich es irgendwie schaffen solltest die IP adresse von Punkt B zu erhalten baust du eine Verbindung zu Punkt B auf
Bei A muss dann Folgendes Ausgeführt werden:
Length:=FileRawRead(FileToSend,"r",999999999) ;Fileobj
;dann verbindung aufbauen
numput(length,var,"UInt")
forcesend(&var) ;Syntax muss noch angepasst werden
numput(clustergrösse,var,"UInt")
forcesend(&var)
Loop,%floor( Length/Clustergrösse) ;Clustergrösse ist die Variable die angibt wie viel du auf einmal schicken willsst
{
Currentposition:=(A_Index-1)*Clustergrösse
VarsetCapaticity(var,clustergrösse)
loop,Clustergrösse
numput(numget(filetosend,Currentposition+A_Index-1,"UChar"),var,A_Index-1,"UChar")
forcesend(&var)
}
Currentposition:=(Currentposition/Clustergrösse+1)*Clustergrösse
if !(length-currentposition)
;finish
VarsetCapaticity(var, length-currentposition)
loop, % length-currentposition
numput(numget(filetosend,Currentposition+A_Index-1,"UChar"),var,A_Index-1,"UChar")
forcesend(&var)
;finish
für das empfänger skript nehm ich mir später noch zeit
Falls es dir noch nicht aufgefallen ist das skript ist mehr ein Bauplan als wirklich funktions tüchtig
Es kann auch sein das das skript noch fehler enthält

Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
es geht um reine LAN Kommunikation. Die Client sollten also die IP des Servers kennen und können sich da dann anmelden mit Usernamen und Client-IP. Sollte kein Problem sein.

Danke für dein Script ich schaus mir natürlich an.

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Hab mir den Code Zeile für Zeile angeschaut. Leider hab ich nicht viel verstanden.
Ich nehme an die Datei die gesendet werden soll wird zuerst zerteilt. In kleine Stücke die der Clustergröße entsprechen richtig?
In den Loop werden anhand der Anzahl der Cluster die Pakete gesendet.
Die "NumPut" sachen verstehe ich nicht so richtig.
VarsetCapaticity versteh ich auch nicht.

Wo kommt forcesend her? Aus einer Lib? Welche?

Hoffe ich konnte dir Folgen. Danke für deine Zeit!!!

Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012
Im LAN ist das ganze natürlich einfacher, ich bin auch von Anfang an, davon ausgegangen das du von einem lokalen Netzwerk sprichst, denn über das Internet kann man, selbst wenn man die globale IP besitzt, nicht einfach jeden x-beliebigen Rechner erreichen, denn die globale IP ist ja lediglich die IP des Routers...

Du hast gesagt, du weißt wie man eine Verbindung herstellt, also kannst du ja bestimmt auch schon Nachrichten versenden...
Wenn du das kannst, solltest du dir zuerst mal eine Struktur überlegen, wie die Verständigung innerhalb des Netzwerkes abläuft...
Das musst du sowieso machen, egal wie weit du das technische verstanden hast..

Was mir für so ein System grundlegend erscheint:
  • Wie werden die angemeldeten Client-Namen gesammelt (zentral / lokal)?
  • Wo und wie meldet sich ein Client als "online" bzw. "offline" (über UDP an alle / Zentral per TCP)?
  • Wie werden Chatlogs aktueller Sitzungen gespeichert?
  • Gibt es einen ranghöheren Client / Admin?
  • Wie wird verhindert das es 2mal den selben Display-Name gibt (temporäre Vergabe für jede Sitzung)?
Mehr fällt mir gerade nicht ein...

Diese Struktur zu entwickeln, hat ersteinmal gar nichts mit coden zu tun, am besten du nimmst dir einen Zettel und überlegst dir wie man die Probleme lösen kann. Ich würde dir als Lösungsansatz empfehlen:
  • Der erste Client der sich anmeldet übernimmt eine zentrale Rolle als "Pseudo-Server"
  • Neue Clients prüfen per UDP ob es bereits einen Client gibt, wenn nicht werden sie selbst zum "Pseudo-Server", wenn doch, übertragen sie per TCP ihre Account-Infos an den Client #1
  • Verlässt ein Client die Sitzung, meldet er sich bei Client #1 ab (TCP)
  • Alle Clients fragen regelmäßig vom Client #1 ab, wer online ist. (TCP)
  • Verlässt Client #1 die Sitzung, übergibt er seine Funktion an einen beliebigen anderen Client (TCP) und teilt allen anderen die Adresse des neuen Client #1 mit (UDP)
EDIT: Ich weiß, das entspricht nicht ganz deinen Vorstellungen, weil du keinen Server verwenden möchtest, aber hier handelt es sich ja auch nicht um einen eigenständigen Rechner als Server sondern um einen dynamisch zugewiesenen Zentral-Punkt ohne den so ein System meiner Meinung nach nicht auskommt.

Find the recent autohotkey version here: ahkscript.org


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Forcesend ist aus der LIB bloss es heisst dort anders und muss auch irgendwie, leicht anders verwendet werden.(AHKsock_ForceSend(iSocket, ptrData, iLength))
loop, % length-currentposition
numput(numget(filetosend,Currentposition+A_Index-1,"UChar"),var,A_Index-1,"UChar")
Bewirkt einfach das length-currentposition Bits von der Variable filetosend an der StartPosition Currentposition
auf die Variable Var übertragen werden.
Ich ging halt davon aus das du es erstmal schaffen willst Info von A nach B zu bugsieren, in Form einer Datei.

Visit the new forum ahkscript.org.

http://ahkscript.org


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Die Basics für die ich mich nun entschieden habe diese möchte ich umsetzen:

1. Es soll eine zentrale Anwendung geben an dem sich die Clients anmelden. Dies können wenn alle online sind anfangs so um die 40 Personen sein später aber auch gut 100.

2. Die Clients kennen also eine IP und einen Port. Melden sich dort an mit dem Usernamen der auch im LAN Verwendet wird (also A_UserName) zudem aber noch einen auf 40 Zeichen begrenzten frei wählbaren Anzeigenahmen.

3. Eine Admin-Anwendung hat zugriff auf die Server-Anwendung und kann diesen neustarten bzw. User rauswerfen und Statistiken einsehen.

4. Jeder User hat im Tray ein Icon. Klickt er darauf öffnet sich eine kleine GUI, angezeigt wird ein Treeview und noch optionen wie "Autorefresh" ggf. noch andere. Über eine Konfigurationsmaske kann jeder User in 5 Listen User festlegen (mit dem LAN Usernamen), dazu ruft die Konfigurationsmaske beim Server die "Wer war Online"-Liste ab. Nur Lan namen die da drin stehen können einer Liste hinzugefügt werden. Im Treeview selbst stehen dann die Anzeigenamen. Diese werden zusammen mit dem Onlinestatus beim Refresh aktualisiert.

5. Klickt man einen User an der als Online angezeigt wird blendet sich die GUI aus und es startet ein ScreenSnippet script. Man klickt zwei koordinaten an und der so erstellte Bildausschnitt wird dann an den angeklickten User übermittelt. Zuvor wird natürlich beim Server angefragt ob der User wirklich noch angemeldet ist. Die Übermittlung wird dem Server gemeldet, der Server bekommt den Dateinamen sowie deren Größe mitgeteilt (damit will ich eine Statistik aufbauen und sehen wieviele Dateien am Tag/Woche/Monat bzw. welche Datenmenge am Tag/Woche/Monat verschickt wurde).

6. Beim Empfänger wird die Datei in einem Verzeichnis gespeichert, der Verzeichnisname ist der LAN-Username des Senders. Die Datei wird per GDI+Lib eingelesen. Die Bildabmessungen können so bestimmt werden. Es wird erkannt ob das Bild größer als 200x200 ist wenn ja wird es unter beibehaltung der Proportionen verkleinert in einer GUI angezeigt. Ist das Bild kleiner oder gleich 200x200 wird es in Originalgröße angezeigt. Die GUI poppt auch nicht direkt auf sondern bleibt im Hintergrund und in der Taskleiste blinkt es. Das Fenster trägt den Anzeigenamen als Titel. Klickt der User auf das Bild öffnet es in Originalgröße im Standard bildbetrachtungsprogram von Windows. Ein rechtsklick bietet die Option des speicherns.

Soviel dazu. Ich will es also wirklich auf den schnellen Bildversan begrenzen. Es soll erstmal kein Chat hinein. Ein Kompletter Screenshot beider Moniotore kommt auf gut 600kb diese müssen also im extremfall übertragen werden.

Was mir nicht ganz klar ist, wie sollte man es lösen wenn ein User zwei Bilder hintereinander sendet? Was passiert dann beim Empfänger? Zwei mal eine GUI öffnen ist nicht gut... wie könnte man das (rein gedanklich erstmal) lösen?

Ja, ich schreib hier viel... und nein ich weiß echt noch nicht wie ich das Lösen soll. Ich werde morgen anfangen zu versuchen eine Verbindung herszustellen, und bei Erfolg etwas auszulösen. Ich hab schon einige Scripte gesehen die sowas können... Mal schauen ob ich da was zusammen basteln kann. Ich weiß aber jetzt schon vom lesen in den Scripts, dass ich bei weitem nicht alles verstehe.

Soviel dazu :)
MfG
fump