201 lines
5.4 KiB
AutoHotkey
201 lines
5.4 KiB
AutoHotkey
#SingleInstance Force
|
|
Network_Port = 12321
|
|
Network_Address = 127.0.0.1
|
|
|
|
NewData := false
|
|
DataReceived =
|
|
Gosub Connection_Init
|
|
return
|
|
|
|
Connection_Init:
|
|
OnExit, ExitSub
|
|
socket := PrepareForIncomingConnection(Network_Address, Network_Port)
|
|
if socket = -1
|
|
ExitApp
|
|
|
|
Process, Exist
|
|
DetectHiddenWindows On
|
|
ScriptMainWindowId := WinExist("ahk_class AutoHotkey ahk_pid " . ErrorLevel)
|
|
DetectHiddenWindows Off
|
|
|
|
NotificationMsg = 0x5555
|
|
OnMessage(NotificationMsg, "ReceiveData")
|
|
|
|
ExitMsg = 0x6666
|
|
OnMessage(ExitMsg, "ExitData")
|
|
|
|
FD_READ = 1
|
|
FD_CLOSE = 32
|
|
FD_CONNECT = 20
|
|
|
|
if DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket,
|
|
"UInt", ScriptMainWindowId, "UInt", ExitMsg, "Int", FD_CLOSE)
|
|
{
|
|
msgbox, closed
|
|
}
|
|
|
|
if DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket,
|
|
"UInt", ScriptMainWindowId, "UInt", NotificationMsg, "Int",
|
|
FD_READ|FD_CONNECT)
|
|
{
|
|
MsgBox % "WSAAsyncSelect() indicated Winsock error "
|
|
. DllCall("Ws2_32\WSAGetLastError")
|
|
DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket,
|
|
"UInt", ScriptMainWindowId, "UInt", ExitMsg, "Int", FD_CLOSE)
|
|
ExitApp
|
|
}
|
|
|
|
SetTimer, NewConnectionCheck, 500
|
|
return
|
|
|
|
PrepareForIncomingConnection(IPAddress, Port)
|
|
{
|
|
VarSetCapacity(wsaData, 32)
|
|
result := DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData)
|
|
if ErrorLevel
|
|
{
|
|
MsgBox % "WSAStartup() could not be called due to error %ErrorLevel%. "
|
|
. "Winsock 2.0 or higher is required."
|
|
return -1
|
|
}
|
|
if result
|
|
{
|
|
MsgBox % "WSAStartup() indicated Winsock error "
|
|
. DllCall("Ws2_32\WSAGetLastError")
|
|
return -1
|
|
}
|
|
AF_INET = 2
|
|
SOCK_STREAM = 1
|
|
IPPROTO_TCP = 6
|
|
socket := DllCall("Ws2_32\socket", "Int", AF_INET,
|
|
"Int", SOCK_STREAM, "Int", IPPROTO_TCP)
|
|
if socket = -1
|
|
{
|
|
MsgBox % "socket() indicated Winsock error "
|
|
. DllCall("Ws2_32\WSAGetLastError")
|
|
return -1
|
|
}
|
|
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", IPAddress),
|
|
SocketAddress, 4, 4)
|
|
if DllCall("Ws2_32\bind", "UInt", socket,
|
|
"UInt", &SocketAddress, "Int", SizeOfSocketAddress)
|
|
{
|
|
MsgBox % "bind() indicated Winsock error "
|
|
. DllCall("Ws2_32\WSAGetLastError") . "?"
|
|
return -1
|
|
}
|
|
if DllCall("Ws2_32\listen", "UInt", socket, "UInt", "SOMAXCONN")
|
|
{
|
|
MsgBox % "LISTEN() indicated Winsock error "
|
|
. DllCall("Ws2_32\WSAGetLastError") . "?"
|
|
return -1
|
|
}
|
|
return socket
|
|
}
|
|
|
|
ReceiveData(wParam, lParam)
|
|
{
|
|
global DataReceived
|
|
global NewData
|
|
global mydata
|
|
global ConnectionList
|
|
socket := wParam
|
|
ReceivedDataSize = 4096
|
|
Loop
|
|
{
|
|
VarSetCapacity(ReceivedData, ReceivedDataSize, 0)
|
|
ReceivedDataLength := DllCall("Ws2_32\recv", "UInt",
|
|
socket, "Str", ReceivedData, "Int", ReceivedDataSize, "Int", 0)
|
|
if ReceivedDataLength = 0
|
|
{
|
|
StringReplace, ConnectionList, ConnectionList, %socket%`n
|
|
DllCall("Ws2_32\closesocket", "UInt", socket)
|
|
}
|
|
if ReceivedDataLength = -1
|
|
{
|
|
WinsockError := DllCall("Ws2_32\WSAGetLastError")
|
|
if WinsockError = 10035
|
|
{
|
|
DataReceived = %TempDataReceived%
|
|
NewData := true
|
|
return 1
|
|
}
|
|
if WinsockError <> 10054
|
|
{
|
|
MsgBox % "recv() indicated Winsock error " . WinsockError
|
|
StringReplace, ConnectionList, ConnectionList, %socket%`n
|
|
DllCall("Ws2_32\closesocket", "UInt", socket)
|
|
}
|
|
}
|
|
mydata := ReceivedData
|
|
gosub myreceive
|
|
if (A_Index = 1)
|
|
TempDataReceived =
|
|
TempDataReceived = %TempDataReceived%%ReceivedData%
|
|
}
|
|
return 1
|
|
}
|
|
|
|
ExitData(wParam, lParam)
|
|
{
|
|
global ConnectionList
|
|
socket := wParam
|
|
ReceivedDataSize = 16
|
|
VarSetCapacity(ReceivedData, ReceivedDataSize, 0)
|
|
ReceivedDataLength := DllCall("Ws2_32\recv", "UInt", socket,
|
|
"Str", ReceivedData, "Int", ReceivedDataSize, "Int", 0)
|
|
StringReplace, ConnectionList, ConnectionList, %socket%`n
|
|
DllCall("Ws2_32\closesocket", "UInt", socket)
|
|
return 1
|
|
}
|
|
|
|
SendData(wParam,SendData)
|
|
{
|
|
SendDataSize := VarSetCapacity(SendData)
|
|
SendDataSize += 1
|
|
Loop, parse, wParam, `n
|
|
{
|
|
If A_LoopField =
|
|
Continue
|
|
socket := A_LoopField
|
|
sendret := DllCall("Ws2_32\send", "UInt", socket,
|
|
"Str", SendData, "Int", SendDatasize, "Int", 0)
|
|
}
|
|
}
|
|
|
|
|
|
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)
|
|
}
|
|
|
|
NewConnectionCheck:
|
|
ConnectionCheck := DllCall("Ws2_32\accept", "UInt", socket,
|
|
"UInt", &SocketAddress, "Int", SizeOfSocketAddress)
|
|
if ConnectionCheck > 1
|
|
ConnectionList = %ConnectionList%%ConnectionCheck%`n
|
|
Return
|
|
|
|
SendProcedure:
|
|
If ConnectionList <>
|
|
{
|
|
SendText = %A_Hour%:%A_Min%:%A_Sec%
|
|
SendData(ConnectionList,SendText)
|
|
}
|
|
Return
|
|
|
|
myreceive:
|
|
TrayTip, server, %mydata%, ,16
|
|
return
|
|
|
|
GuiClose:
|
|
ExitSub:
|
|
DllCall("Ws2_32\WSACleanup")
|
|
ExitApp
|