 |
AutoHotkey Community Wir helfen uns gegenseitig aus der Patsche
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 5:58 pm Titel: UDP-LAN chat |
|
|
Endlich ist es soweit und ich darf mit stolz Präsentieren:
der erste AHK-UDP-LAN chat v1.0
Vorteile:
- Keine IP-Adresse nötig!
- Kein verbindungsaubau nötig
- Einfaches senden an alle Clienten
- schneller als TCP/IP (beim senden an mehrere clients)
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 |
|
 |
Skiper
Anmeldedatum: 08.02.2009 Beiträge: 78 Wohnort: C:\Baden-Württemberg\Wiernsheim.dll
|
Verfasst am: Mo März 02, 2009 7:00 pm Titel: |
|
|
nicht schlecht, aber warum Sendet es bei mir immer Zweimal ?
ist überhaupt für XP ^^ (denke schon sieht zumindest so aus) _________________ Let me google that for you |
|
| Nach oben |
|
 |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 7:10 pm Titel: |
|
|
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 |
|
 |
Skiper
Anmeldedatum: 08.02.2009 Beiträge: 78 Wohnort: C:\Baden-Württemberg\Wiernsheim.dll
|
Verfasst am: Mo März 02, 2009 7:12 pm Titel: |
|
|
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 |
|
 |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 7:16 pm Titel: |
|
|
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 |
|
 |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 7:23 pm Titel: |
|
|
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 |
|
 |
Skiper
Anmeldedatum: 08.02.2009 Beiträge: 78 Wohnort: C:\Baden-Württemberg\Wiernsheim.dll
|
|
| Nach oben |
|
 |
Ripp3r]D3[
Anmeldedatum: 11.11.2007 Beiträge: 1773 Wohnort: Altenburg\Kernel32.dll
|
Verfasst am: Mo März 02, 2009 8:28 pm Titel: |
|
|
geht das auch über internet oder nur lokal? _________________ DANKE->
Top-10 |
|
| Nach oben |
|
 |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 8:33 pm Titel: |
|
|
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 |
|
 |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 8:39 pm Titel: |
|
|
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 |
|
 |
Ripp3r]D3[
Anmeldedatum: 11.11.2007 Beiträge: 1773 Wohnort: Altenburg\Kernel32.dll
|
Verfasst am: Mo März 02, 2009 8:43 pm Titel: |
|
|
und was muss ich da genau ändern? _________________ DANKE->
Top-10 |
|
| Nach oben |
|
 |
Bentschi
Anmeldedatum: 03.05.2008 Beiträge: 1084
|
Verfasst am: Mo März 02, 2009 8:52 pm Titel: |
|
|
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 |
|
 |
IsNull
Anmeldedatum: 20.12.2006 Beiträge: 4026 Wohnort: Eidgenosse
|
|
| Nach oben |
|
 |
Z_Gecko Gast
|
Verfasst am: Do März 05, 2009 5:45 am Titel: |
|
|
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
|
Verfasst am: Do März 05, 2009 6:43 am Titel: |
|
|
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 |
|
 |
|
|
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
|