Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

UDP-LAN chat
Gehe zu Seite 1, 2, 3, 4, 5  Weiter
 
Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Vollständige Skripte & Funktionen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 5:58 pm    Titel: UDP-LAN chat Antworten mit Zitat

Endlich ist es soweit und ich darf mit stolz Präsentieren:
der erste AHK-UDP-LAN chat v1.0


Very Happy Vorteile:
- Keine IP-Adresse nötig!
- Kein verbindungsaubau nötig
- Einfaches senden an alle Clienten
- schneller als TCP/IP (beim senden an mehrere clients)

Sad Nachteile:
- Sind keine bekannt

Und hier ist der code:
Code:
Port = 6886 ; Frei verwendbare UDP portnummern = 1025 bis 32767

AF_INET := 2
AF_INET6 := 10
PF_INET := 2
SOCK_DGRAM := 2
IPPROTO_UDP := 17
INADDR_ANY := 0
FIONREAD := 0x4004667f
INADDR_BROADCAST = 0xFFFFFFFF
SOL_SOCKET := 0xFFFF
SO_BROADCAST := 0x0020
MSG_DONTROUTE := 4

#Persistent
Gui, add, edit, x10 y10 w395 vSendData
Gui, add, button, x410 yp w100 gSend +default, Senden >>
Gui, add, edit, x10 y+5 w500 r20 vRecvData +readonly
Gui, show,, AHK-UDP-LAN chat

OnExit, ExitSub

VarSetCapacity(wsaData, 32)
If (DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData) != 0 or ErrorLevel != 0)
  errormsg("WSAStartup()")

RecvSocket:
recvsocket := DllCall("Ws2_32\socket", "Int", PF_INET, "Int", SOCK_DGRAM, "Int", IPPROTO_UDP)
if recvsocket = -1
  errormsg("socket()")
SizeOfSocketAddress = 16
VarSetCapacity(SocketAddress, SizeOfSocketAddress)
InsertInteger(2, SocketAddress, 0, AF_INET)
InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2)
InsertInteger(DllCall("Ws2_32\inet_addr", "Str", INADDR_ANY), SocketAddress, 4, 4)
if DllCall("Ws2_32\bind", "UInt", recvsocket, "UInt", &SocketAddress, "Int", SizeOfSocketAddress)
  errormsg("bind()")
Settimer, Recv, 200

BcSocket:
SizeOfSocketAddress = 16
VarSetCapacity(SocketAddress, SizeOfSocketAddress)
InsertInteger(2, SocketAddress, 0, AF_INET)
InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2)
InsertInteger(DllCall("Ws2_32\inet_addr", "Str", INADDR_BROADCAST), SocketAddress, 4, 4)
bcsocket := DllCall("Ws2_32\socket", "Int", PF_INET, "Int", SOCK_DGRAM, "Int", IPPROTO_UDP)
if bcsocket = -1
  errormsg("socket()")
SizeOfB = 16
VarSetCapacity(B,SizeOfB)
B = 1
If DllCall("Ws2_32\setsockopt", "UInt", bcsocket, "UInt", SOL_SOCKET, "UInt", SO_BROADCAST, "UInt", &B, "Int", SizeOfB) != 0
  errormsg("setsockopt()")
return

Send:
Gui, submit, nohide
StringSplit, DataBufLength, SendData
DataBufLength := DataBufLength0
VarSetCapacity(DataBuf, DataBufLength)
DataBuf := SendData
result := DllCall("Ws2_32\sendto", "UInt", bcsocket, "UInt", &DataBuf, "Int", DataBufLength, "Int", MSG_DONTROUTE, "UInt", &SocketAddress, "Int", SizeOfSocketAddress)
If result != %DataBufLength%
{
  If result < %DataBufLength%
    Msgbox, sendto() indicated Winsock error "Data lost!"
  else
    errormsg("sendto()")
}
return

Recv:
VarSetCapacity(U,1024)
If DllCall("Ws2_32\ioctlsocket", "UInt", recvsocket, "UInt", FIONREAD, "UInt", &U) != 0
  errormsg("ioctlsocket()")
If NumGet(U) > 0
{

  VarSetCapacity(Buffer,0)
  VarSetCapacity(FromBuffer,0)
  VarSetCapacity(FromBufferLength,0)
  VarSetCapacity(Buffer, NumGet(U))
  VarSetCapacity(FromBuffer, 32)
  VarSetCapacity(FromBufferLength, 64)
  result := DllCall("Ws2_32\recvfrom", "UInt", recvsocket, "UInt", &Buffer, "UInt", NumGet(U), "UInt", 0, "UInt", &FromBuffer, "UInt", &FromBufferLength)
  If result = -1
   errormsg("recvfrom()")
  else
  {
    FromIP =
    FromPort =
    Received =

    Loop, % NumGet(U)
      Received := Received Chr(NumGet(Buffer, A_Index - 1, "Char"))
    FromLength := NumGet(FromBufferLength, 0, "Char")
    If (NumGet(FromBuffer, 0, "UShort") = AF_INET)
    {
      Loop, 4
      {
        If FromIP =
          FromIP := NumGet(FromBuffer, A_Index + 3, "UChar")
        else
          FromIP := FromIP "." NumGet(FromBuffer, A_Index + 3, "UChar")
      }
    }
    thisreceived := FromIP A_Tab Received
    If thisreceived = %lastreceived%
      return
    lastreceived := thisreceived
    Log := FromIP A_Tab Received "`n" Log
    GuiControl,, RecvData, %Log%
  }
}
return














f12::
Gui, show
return



InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
{
  Loop %pSize%
    DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
}

errormsg(msg)
{
  MsgBox % msg . " indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") . "?"
  exitapp
}

ExitSub:
DllCall("Ws2_32\WSACleanup")
ExitApp

_________________

Heightmap-Raser
Moderator


Zuletzt bearbeitet von Bentschi am Mo März 02, 2009 7:21 pm, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skiper



Anmeldedatum: 08.02.2009
Beiträge: 78
Wohnort: C:\Baden-Württemberg\Wiernsheim.dll

BeitragVerfasst am: Mo März 02, 2009 7:00 pm    Titel: Antworten mit Zitat

nicht schlecht, aber warum Sendet es bei mir immer Zweimal ?

ist überhaupt für XP ^^ Wink (denke schon sieht zumindest so aus)
_________________
Let me google that for you
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 7:10 pm    Titel: Antworten mit Zitat

Funktioniert für XP und Vista
Ältere Windows kann ich nicht genau sagen, zumindest sollte Winsock2.0 installiert sein (bei XP und Vista vorhanden)

btw. warum sollte er doppelt senden?
Vielleicht hast du nur zweimal Enter/Senden gedrückt?
_________________

Heightmap-Raser
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skiper



Anmeldedatum: 08.02.2009
Beiträge: 78
Wohnort: C:\Baden-Württemberg\Wiernsheim.dll

BeitragVerfasst am: Mo März 02, 2009 7:12 pm    Titel: Antworten mit Zitat

ne bin ja nicht blöde und schreib nur weil es einmal vorkommt das passiert jedes mal.
_________________
Let me google that for you
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 7:16 pm    Titel: Antworten mit Zitat

kann nicht sagen woran das liegt bei mir funktioniert dieses Script von oben unter Vista und XP könnte es eventuell auch daran liegen dass ein Router oder das Netzwerk selbst daran schuld ist dass die Msg 2x ankommt?
_________________

Heightmap-Raser
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 7:23 pm    Titel: Antworten mit Zitat

hab den code jetzt etwas verändert damit keine echos erlaubt werden.

@Skiper kannst du eventuell den neuen code mal versuchen?
_________________

Heightmap-Raser
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skiper



Anmeldedatum: 08.02.2009
Beiträge: 78
Wohnort: C:\Baden-Württemberg\Wiernsheim.dll

BeitragVerfasst am: Mo März 02, 2009 8:01 pm    Titel: Antworten mit Zitat

klar doch und es geht. Wink
_________________
Let me google that for you
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Ripp3r]D3[



Anmeldedatum: 11.11.2007
Beiträge: 1773
Wohnort: Altenburg\Kernel32.dll

BeitragVerfasst am: Mo März 02, 2009 8:28 pm    Titel: Antworten mit Zitat

geht das auch über internet oder nur lokal?
_________________
DANKE->

Top-10
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 8:33 pm    Titel: Antworten mit Zitat

Dieses Script ist funktioniert nur lokal. (absichtlich)

Da ich noch nicht weiß wie sich so ein broadcast verhällt wenn man es vom Router rauslässt.

Wenn du es versuchen willst brauchst du eigentlich nur unter "Send:", "MSG_DONTROUTE" ändern.

Siehe MSDN http://msdn.microsoft.com/en-us/library/ms740148
_________________

Heightmap-Raser
Moderator


Zuletzt bearbeitet von Bentschi am Mo März 02, 2009 8:42 pm, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 8:39 pm    Titel: Antworten mit Zitat

btw. wenn ich mir im taskmanager die internetverbindung ansehe (Modem).
muss ich feststellen dass das ganze auch ins www gesendet wird.

Aber durch den Router nach drausen funktioniert trotzdem nicht.
_________________

Heightmap-Raser
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Ripp3r]D3[



Anmeldedatum: 11.11.2007
Beiträge: 1773
Wohnort: Altenburg\Kernel32.dll

BeitragVerfasst am: Mo März 02, 2009 8:43 pm    Titel: Antworten mit Zitat

und was muss ich da genau ändern?
_________________
DANKE->

Top-10
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Mo März 02, 2009 8:52 pm    Titel: Antworten mit Zitat

Ich bin mir nicht sicher aber du könntest es gegen einen von diesen austauschen. (in der SentTo DllCall)
Code:
MSG_OOB       =      1
MSG_PEEK      =      2
MSG_DONTROUTE =      4
MSG_MAXIOVLEN =     16
MSG_PARTIAL   = 0x8000

Sollte eines von diesen nicht passen wird eine Fehlermeldung angezeigt beim senden.
_________________

Heightmap-Raser
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
IsNull



Anmeldedatum: 20.12.2006
Beiträge: 4026
Wohnort: Eidgenosse

BeitragVerfasst am: Di März 03, 2009 9:01 pm    Titel: Antworten mit Zitat

Hey das ist ganz nice. Werde das mal ausgibig testen Smile
_________________
Anfänger Manuals
AHK 1.1 HowTos
securityvision
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Z_Gecko
Gast





BeitragVerfasst am: Do März 05, 2009 5:45 am    Titel: Antworten mit Zitat

sehr schön!
mit der UDP-Broadcast Funktionalität könnte man jetzt wunderbare selbstorganisierende Clientnetzwerke aufbauen. (Mir persönlich schwebt gerade ein serverloses, sich selbst permanent abgleichendes Twitter fürs LAN vor)

Aber übers Internet wird sowas wohl (hoffentlich) nicht funktionieren. Ansonsten könnte ich mit ein paar Rechnern das ganze Internet lahmlegen.
Ein Broadcast wird ja an alle Clients eines Netwerks gesendet, im Internet wären das ja Alle, die ans Internet angeschlossen sind; da würde das Netz schon bald glühen. Zusätzlichhat das Internet ja teilweise eine Ringstruktur, so das ein Broadcast im schlechtesten Fall ewig kreisen würde.
Daher gehe ich davon aus, das alle Telcos Broadcasts nicht weiterleiten.
Nach oben
Bentschi



Anmeldedatum: 03.05.2008
Beiträge: 1084

BeitragVerfasst am: Do März 05, 2009 6:43 am    Titel: Antworten mit Zitat

Jaja da hast du schon recht

hab ein bisschen danach gegoogelt, resultat:
Ein broadcast wird nicht ins Internet gesendet, sehr wohl aber kann man eine UDP verbindung mit einem Computer im Internet aufbauen wenn man die IP und den Port hat, aber dazu kann man ja auch TCP/IP verwenden, also ist es so und so nur für LAN geeignet.

BTW: mir ist auch schon einiges vorgeschwebt mit diesem Script mit kleinen änderungen kann man damit sogar eine "LAN-clipboard" erstellen,
etwas synchronisieren, ja und sogar Dateien versenden und und und...

Ich werde demnächst noch ein Client Serverscript daraus basteln. Da man ja meisens einen Server verwendet und daten an clients sendet und die clients können dann auf die Addresse des Servers zurücksenden(für andere nicht sichtbar).
_________________

Heightmap-Raser
Moderator
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Vollständige Skripte & Funktionen Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3, 4, 5  Weiter
Seite 1 von 5

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de