1 (изменено: Drugoy, 2013-10-24 17:24:13)

Тема: AHK: Портовый приёмник

Помогите написать простейший сценарий портового приёмника.
Мне всего-то и нужно, чтобы сценарий следил за указанным портом и при приёме любых пакетов, отправленных на этот порт - сценарий бы просто выдавал бы содержимое этих пакетов через оповещение с помощью MessageBox.

Я пробовал использовать вместе с этой библиотекой следующий сценарий:

#Persistent
AHKsock_Listen(9, notify) ; I've also tried AHKsock_Listen(9, "notify")

notify()
{
    msgbox port 9 received a packet!
}

Но при приёме пакетов - сценарий не срабатывает должным образом.
В другом месте мне посоветовали такой сценарий:

AHKsock_Listen(9, "notify")

notify(sEvent, iSocket = 0, sName = 0, sAddr = 0, sPort = 0, ByRef bData = 0, bDataLength = 0)
{
  str := "Event: " sEvent "`nIP: " sAddr "`nPort: " sPort
  if (sEvent = "RECEIVED")
  {
    str := "`n These bytes were received:`n{"
    Loop % bDataLength
      str .= NumGet(bData, A_Index-1, "uchar") ", "
    str := SubStr(str, 1, StrLen(str)-2) "}"
  }

  Msgbox % str
}

Но и он не работает.

2

Re: AHK: Портовый приёмник

Наткнулся на пост одного немца, который написал скрипт AHK-UDP-LAN chat.
Скрипт целиком и полностью состоит из DllCall'ов, в которых я ни бельмеса не понимаю, а код к тому же не содержит комментариев даже на немецком.

Методом проб удалось убрать из скрипта лишнее и получилось это:

#SingleInstance, Force
OnExit, ExitSub

; Settings.
checkPeriod := 1000
port := 9    ; Port to monitor.

; Some initial voodoo magic.
VarSetCapacity(wsaData, 32)
VarSetCapacity(SocketAddress, 16)
VarSetCapacity(U, 1) ; It was 1024, but 1 works too.
DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData)
DllCall("Ws2_32\socket", "Int", 2, "Int", 2, "Int", 17)
InsertInteger(2, SocketAddress, 0, 2)
InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2)
InsertInteger(DllCall("Ws2_32\inet_addr", "Str", 0), SocketAddress, 4, 4)
DllCall("Ws2_32\bind", "UInt", 284, "UInt", &SocketAddress, "Int", 16)

Loop    ; Periodic check.
{
    DllCall("Ws2_32\ioctlsocket", "UInt", 284, "UInt", 0x4004667f, "UInt", &U)
    If NumGet(U) != 0
        trigger(port)
    Sleep, checkPeriod
}

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

trigger(port)    ; We got a packet.
{
    MsgBox, The incoming packet on port %port% was received!
    Reload
}

ExitSub:    ; Clean something upon exit.
DllCall("Ws2_32\WSACleanup")
ExitApp

этот скрипт реагирует на любой входящий пакет по указанному порту.

Но в нём есть 2 недостатка:
1. мне не удалось заставить MsgBox выводить содержимое полученного пакета.
2. после получения пакета приходится перезапускать скрипт, т.к. иначе следующая проверка снова приводит к срабатыванию триггера. Это "overkill", но я не нашёл как заставить скрипт продолжать работать но забыть о ранее полученном пакете. Пробовал обнулять переменную - не помогло. Более того, она всегда якобы пустая, только её длина каждый раз отличается. Пробовал менять его длину обратно в 0 через VarSetCapacity - не помогло.

3 (изменено: Alectric, 2013-10-29 14:26:32)

Re: AHK: Портовый приёмник

2. Может это нужно обнулять:

DllCall("Ws2_32\WSACleanup")

и заново вызывать DLLку в начале...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

4

Re: AHK: Портовый приёмник

Для чтения из сокета функция recv применяется вроде. Не вижу, чтобы код немца что-то читал вообще. Если речь о переменной wsaData, то она нужна для инициализации WSA, насколько помню.

5

Re: AHK: Портовый приёмник

Проблема более не актуальна.

6 (изменено: Alectric, 2015-11-14 19:38:28)

Re: AHK: Портовый приёмник

Если у кого-то возникнет подобный вопрос еще раз.

В локальной сети все работает. Пытался через интернет, но, скорей всего из-за роутера, не работает, возможно поможет "открытие порта" на роутере.

На всякий случай в файле все скрипты автора и библиотека. Все скрипты работают через порт 27015.

Post's attachments

TCPIP.zip 188 kb, 18 downloads since 2015-11-14 

You don't have the permssions to download the attachments of this post.
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.