Help with a script to listen to a port

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Help with a script to listen to a port

23 Oct 2013, 19:59

I need a simple script that listens to the specified port and msgboxes the packet's contents upon receiving a packet to the port listened.

I've read about AHKsock, but it seems like it's already targeted to serve a different purpose (client <> server communication).

I've tried to use it like this:

Code: Select all

#Persistent
AHKsock_Listen(9, notify) ; I've also tried AHKsock_Listen(9, "notify")
notify()
{
     msgbox port 9 received a packet!
}
but it doesn't work.

Could someone please help me with that?
Last edited by kidbit on 25 Oct 2013, 11:38, edited 1 time in total.
question := (2b) || !(2b) © Shakespeare.
User avatar
LinearSpoon
Posts: 156
Joined: 29 Sep 2013, 22:55

Re: Help with sockets

24 Oct 2013, 00:55

I don't know how this can be done but I've done enough with AHKsock and this is closer to the proper usage:

Code: Select all

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
}
The callback parameters are required, and the function name should be passed as a string.
However, you are correct, AHKsock is designed for server<->client connections. What AHKsock_Listen actually does is set up a server socket on the specified port, which probably isn't what you want...
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with sockets

24 Oct 2013, 06:52

LinearSpoon
sorry, but for me - it doesn't react on receiving the incoming packets to that port.
question := (2b) || !(2b) © Shakespeare.
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

25 Oct 2013, 11:40

What are generally the ways for an AHK script to work with a port?
Is it COM? Or is it DllCall? Or maybe WMI?
question := (2b) || !(2b) © Shakespeare.
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

26 Oct 2013, 12:59

So okay, I've taken this script and cut it badly up to the following:

Code: Select all

#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) ; Initially it was 1024, but it works even if it's 1.
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
It reacts to any incoming packet that was received on the specified port, but I can't make the script expose the contents of that packet + the whole script works in a barbarian way: when the packet is received - the script gets reloaded. That's an overkill, but I failed to find out what I shall do to make the script continue working without further calling trigger():
- cleaning variables didn't help;
- U seems to be blank even when it's NumGet is not 0.

Could someone help me fix these 2 issues in that script?
1. Make it show the packet's contents.
2. Handle packets without restarting the whole script.
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

27 Oct 2013, 01:54

Why are you trying to cut down the scripts although you obviously do not understand how they work?
  • InsertInteger should be replaced by NumPut, but that's not a problem here. (http://ahkscript.org/docs/Functions.htm#BuiltIn)
  • DllCall("Ws2_32\socket", "Int", 2, "Int", 2, "Int", 17) (http://msdn.microsoft.com/en-us/library ... s.85).aspx
    will create a socket for
    • AF_INET (2) -> IPv4
    • SOCK_DGRAM (2)
    • IPPROTO_UDP (17)
    The function returns a SOCKET descriptor of type UINT_PTR which must be stored in a variable for further use.
  • DllCall("Ws2_32\bind", "UInt", 284, "UInt", &SocketAddress, "Int", 16) (http://msdn.microsoft.com/en-us/library ... s.85).aspx)
    The first parameter has to be the SOCKET descriptor returned by Ws2_32\socket.
  • DllCall("Ws2_32\ioctlsocket", "UInt", 284, "UInt", 0x4004667f, "UInt", &U) (http://msdn.microsoft.com/en-us/library ... s.85).aspx)
    • The first parameter has to be the SOCKET descriptor returned by Ws2_32\socket.
    • The second parameter is FIONREAD (0x4004667f)
      MSDN wrote:Use to determine the amount of data pending in the network's input buffer that can be read from socket s. The argp parameter points to an unsigned long value in which ioctlsocket stores the result. FIONREAD returns the amount of data that can be read in a single call to the recv function, which may not be the same as the total amount of data queued on the socket. If s is message oriented (for example, type SOCK_DGRAM), FIONREAD still returns the amount of pending data in the network buffer, however, the amount that can actually be read in a single call to the recv function is limited to the data size written in the send or sendto function call.
    • As said above, you have to call WS2_32\recv to get the data. (http://msdn.microsoft.com/en-us/library ... s.85).aspx)
BTW: You can find an updated version of Bentschi's Socket Class here.
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

27 Oct 2013, 08:34

just me wrote:Why are you trying to cut down the scripts although you obviously do not understand how they work?
Isn't that obvious? Because the initial script contains lots of stuff I don't need (that script is a whole UDP lan chat) and I didn't know how to do what I needed other than cutting that script's functionality down to the minimum I need.
just me wrote:
I'm sorry, but I'm not able to do that myself: it's not that I'm lazy or that I didn't try to understand how to do that, it's just they seem completely different to me: NumPut() is just a function with 4 parameters, while InsertInteger() [which generally has the same parameters (except for the last one that doesn't match NumPut()'s one)] inside of itself runs a loop of DllCall()s, while NumPut() does nothing of that at all.
just me wrote:
  • DllCall("Ws2_32\socket", "Int", 2, "Int", 2, "Int", 17) (http://msdn.microsoft.com/en-us/library ... s.85).aspx
    will create a socket for
    • AF_INET (2) -> IPv4
    • SOCK_DGRAM (2)
    • IPPROTO_UDP (17)
    The function returns a SOCKET descriptor of type UINT_PTR which must be stored in a variable for further use.
Wow, that actually explained quite something for me (at least now I know the possible arguments for that DllCall. Seems like I've used the right arguments.
I wanted to ask what is UINT_PTR, but this link seems to have explained what's that.
just me wrote:
Got it, but I have another question here: I don't see how that function's syntax in C++
int bind(
_In_ SOCKET s,
_In_ const struct sockaddr *name,
_In_ int namelen
);

transformed into AHK's syntax DllCall("Ws2_32\bind", "UInt", 284, "UInt", &SocketAddress, "Int", 16), because in C++ I see only 1 "int" for the third parameter, while that's not anyhow obvious that the first two parameters are UInts. Could you explain that?
just me wrote:
Got it.
just me wrote:
    • The second parameter is FIONREAD (0x4004667f)
      MSDN wrote:Use to determine the amount of data pending in the network's input buffer that can be read from socket s. The argp parameter points to an unsigned long value in which ioctlsocket stores the result. FIONREAD returns the amount of data that can be read in a single call to the recv function, which may not be the same as the total amount of data queued on the socket. If s is message oriented (for example, type SOCK_DGRAM), FIONREAD still returns the amount of pending data in the network buffer, however, the amount that can actually be read in a single call to the recv function is limited to the data size written in the send or sendto function call.
Sorry, but I don't understand what you meant by quoting: did you quote it just to give some explanation of what those 2nd and 3rd parameters in Ws2_32\ioctlsocket() mean or did you mean that I need to change the way they are used in my code?
just me wrote:
Like this?
VarSetCapacity(packetContents, NumGet(U))
U := DllCall("Ws2_32\recv", "UInt", socket_S, "UInt", &packetContents, "UInt", NumGet(U))

Shall I execute this every time I run the check "are there any incoming packets to that port?" and thus put it into the loop I have?
You didn't say a single word about the code's structure (the sequence of commands and the correctness of the choice about what commands to run in a loop), does it need any changes?
just me wrote:BTW: You can find an updated version of Bentschi's Socket Class here.
I don't know what's this. The code has no comments, and I'm still a total newb to all these DllCall()'s and VarSetCapacity()'s, so I'd better stick to my current task.

The result is the following, and now receiving a packet doesn't trigger anything at all.

Code: Select all

#SingleInstance, Force
OnExit, ExitSub

global U, global port, global socket_S, global packetContents
; Settings.
checkPeriod := 1000
port := 9	; Port to monitor.

; Some initial voodoo magic.
VarSetCapacity(wsaData, 32)
VarSetCapacity(SocketAddress, 16)
VarSetCapacity(U, 1024)
DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData)
socket_S := 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", socket_S, "UInt", &SocketAddress, "Int", 16)

Loop	; Periodic check.
{
	VarSetCapacity(packetContents, NumGet(U))
	U := DllCall("Ws2_32\recv", "UInt", socket_S, "UInt", &packetContents, "UInt", NumGet(U))
	DllCall("Ws2_32\ioctlsocket", "UInt", socket_S, "UInt", 0x4004667f, "UInt", &U)
	If NumGet(U) != 0
		trigger()
	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()	; We got a packet.
{
	msgbox U: '%U%'`nsocket_S: '%socket_S%'`npacketContents: '%packetContents%'`n
}

ExitSub:	; Clean something upon exit.
DllCall("Ws2_32\WSACleanup")
ExitApp
just me, thanks a lot for your help, but I'm going to need some more :)
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

28 Oct 2013, 02:10

Network is not my special subject, but I'll try to help anyway as long as no specialist will do.

This is what I've come up as yet. I'll add some explanations as soon as I have time.

Code: Select all

#NoEnv
#SingleInstance, Force
OnExit, ExitSub

Global U, port, socket_S, packetContents

; Windows constants
AF_INET := 2
INADDR_ANY := 0
IPPROTO_UDP := 17
SOCK_DGRAM := 2

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

; Some initial voodoo magic.
VarSetCapacity(wsaData, 32, 0) ; you should always initialize the variables
VarSetCapacity(SocketAddress, 16, 0)
VarSetCapacity(U, A_PtrSize, 0) ; U is pointer sized
DllCall("Ws2_32\WSAStartup", "UShort", 0x0202, "Ptr", &wsaData) ; version 2.2
socket_S := DllCall("Ws2_32\socket", "Int", AF_INET, "Int", SOCK_DGRAM, "Int", IPPROTO_UDP)
NumPut(AF_INET, SocketAddress, 0, "UShort")
NumPut(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, "UShort")
NumPut(INADDR_ANY, SocketAddress, 4, "UInt") ; we have no IP address string, so we don't need to call Ws2_32.dll\inet_addr
DllCall("Ws2_32\bind", "Ptr", socket_S, "Ptr", &SocketAddress, "Int", 16)

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

}

trigger()   ; We got a packet.
{
   VarSetCapacity(packetContents, NumGet(U), 0)
   U := DllCall("Ws2_32\recv", "Ptr", socket_S, "Ptr", &packetContents, "UInt", NumGet(U))
   msgbox U: '%U%'`nsocket_S: '%socket_S%'`npacketContents: '%packetContents%'`n
}

ExitSub:   ; Clean something upon exit.
DllCall("Ws2_32\WSACleanup")
ExitApp
*not tested*
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

28 Oct 2013, 06:06

just me, well that works the very same way as my initial script does without the restart command:
It doesn't show packet's contents and after receiving the 1st packet the messagebox shows up every time a loop runs.
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

28 Oct 2013, 11:59

Mmmh, back to this script. If it was ever working, this shortened version may work, too. But I didn't test it.

Code: Select all

#NoEnv
#Persistent
; ----------------------------------------------------------------------------------------------------------------------
AF_INET := 2
PF_INET := AF_INET
SOCK_DGRAM := 2
IPPROTO_UDP := 17
INADDR_ANY := 0
FIONREAD := 0x4004667F
; WSADESCRIPTION_LEN := 256, WSASYS_STATUS_LEN  := 128
WSADATAsize := 388 + (2 * 4) + A_PtrSize + (A_PtrSize - 2)
SOCKADDRsize := 16
; --------------------------------------------------------------
Port = 6886 ; Frei verwendbare UDP portnummern = 1025 bis 32767
; ----------------------------------------------------------------------------------------------------------------------
OnExit, AppExit
; ----------------------------------------------------------------------------------------------------------------------
; Init DLL
VarSetCapacity(WSADATA, WSADATAsize, 0)
If (DllCall("Ws2_32.dll\WSAStartup", "UShort", 0x0202, "Ptr", &WSADATA, "Int")
   ErrorMsg("WSAStartup()")
; Socket
RecvSocket := DllCall("Ws2_32.dll\socket", "Int", PF_INET, "Int", SOCK_DGRAM, "Int", IPPROTO_UDP, "UPtr")
If (RecvSocket = 0xFFFFFF)
   ErrorMsg("socket()")
VarSetCapacity(SOCKADDR, SOCKADDRsize, 0)
NumPut(PF_INET, SOCKADDR, 0, "Short")
NumPut(DllCall("Ws2_32.dll\htons", "UShort", Port), SOCKADDR, 2, "UShort")
NumPut(INADDR_ANY, SOCKADDR, 4, "UInt")
; Bind
If DllCall("Ws2_32.dll\bind", "Ptr", RecvSocket, "Ptr", &SOCKADDR, "Int", SOCKADDRsize, "Int")
   ErrorMsg("bind()")
Settimer, Recv, 200
Return
; ----------------------------------------------------------------------------------------------------------------------
Recv:
VarSetCapacity(Arg, A_PtrSize, 0)
If DllCall("Ws2_32.dll\ioctlsocket", "Ptr", RecvSocket, "UInt", FIONREAD, "Ptr", &Arg, "Int")
   ErrorMsg("ioctlsocket()")
If ((RecvLen := NumGet(Arg, "UInt")) > 0) {
   VarSetCapacity(Buffer, RecvLen, 0)
   VarSetCapacity(FromBuffer, 16, 0)
   Result := DllCall("Ws2_32.dll\recvfrom", "Ptr", RecvSocket, "Ptr", &Buffer, "UInt", RecvLen
                                          , "UInt", 0, "Ptr", &FromBuffer, "Ptr", 0, "Int")
   If (Result = -1)
      ErrorMsg("recvfrom()")
   FromIP := ""
   Received := ""
   Received := StrGet(&Buffer, RecvLen, "CP0")
   If (NumGet(FromBuffer, 0, "UShort") = AF_INET) {
      Loop, 4 {
         If (FromIP = "")
            FromIP := NumGet(FromBuffer, A_Index + 3, "UChar")
         Else
            FromIP .= "." . NumGet(FromBuffer, A_Index + 3, "UChar")
      }
   }
   NewReceived := FromIP . A_Tab . Received
   If (NewReceived = LastReceived)
      Return
   LastReceived := NewReceived
   MsgBox, 0, Received Data, %NewReceived%
}
Return
; ----------------------------------------------------------------------------------------------------------------------
ErrorMsg(Msg) {
  MsgBox % Msg . " indicated Winsock error " . DllCall("Ws2_32.dll\WSAGetLastError") . "?"
  ExitApp
}
; ----------------------------------------------------------------------------------------------------------------------
AppExit:
   DllCall("Ws2_32.dll\WSACleanup")
ExitApp
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

28 Oct 2013, 13:22

upon receiving the first packet it shows this messagebox: recvfrom() indicated Winsock error 10014? and quits.
question := (2b) || !(2b) © Shakespeare.
User avatar
LinearSpoon
Posts: 156
Joined: 29 Sep 2013, 22:55

Re: Help with a script to listen to a port

28 Oct 2013, 15:29

WSA error codes & descriptions: http://msdn.microsoft.com/en-us/library ... s.85).aspx

From recvfrom() msdn page:
If the from parameter is nonzero and the socket is not connection oriented, (type SOCK_DGRAM for example), the network address of the peer that sent the data is copied to the corresponding sockaddr structure. The value pointed to by fromlen is initialized to the size of this structure and is modified, on return, to indicate the actual size of the address stored in the sockaddr structure.
My guess is that it wants to put a value into fromlen, but you've given it an invalid pointer.

Not tested.

Code: Select all

   VarSetCapacity(FromBuffer, 20, 0), Numput(16, FromBuffer, 16, "int")  ;Initialize to size of address structure
   Result := DllCall("Ws2_32.dll\recvfrom", "Ptr", RecvSocket, "Ptr", &Buffer, "UInt", RecvLen
                                          , "UInt", 0, "Ptr", &FromBuffer, "Ptr", &FromBuffer+16, "Int")
;Allocates extra space in FromBuffer since I doubt this fromlen value was meant to be used later
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

28 Oct 2013, 15:34

LinearSpoon, same
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

28 Oct 2013, 16:12

My last guess:

Code: Select all

If ((RecvLen := NumGet(Arg, "UInt")) > 0) {
   VarSetCapacity(Buffer, RecvLen, 0)
   VarSetCapacity(FromBuffer, 32)          ; original script
   VarSetCapacity(FromBufferLength, 64)    ; original script
   Result := DllCall("Ws2_32.dll\recvfrom", "Ptr", RecvSocket, "Ptr", &Buffer, "UInt", RecvLen
                                          , "UInt", 0, "Ptr", &FromBuffer, "Ptr", &FromBufferLength, "Int")
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

28 Oct 2013, 16:21

same again
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

29 Oct 2013, 01:16

Well, I ported the whole script, and this is tested and working:

Code: Select all

If ((RecvLen := NumGet(Arg, "UInt")) > 0) {
   VarSetCapacity(Buffer, RecvLen, 0)
   VarSetCapacity(FromBuffer, 16, 0)
   FromBufferLen := 16
   Result := DllCall("Ws2_32.dll\recvfrom", "Ptr", RecvSocket, "Ptr", &Buffer, "UInt", RecvLen
                                          , "UInt", 0, "Ptr", &FromBuffer, "IntP", FromBufferLen, "Int")
   ...
   ...
(Win 7 x64 - AHK 1.1.13.00 U64)
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

29 Oct 2013, 04:56

just me, yay! Image finally it works! (thoughI'm on ahk_L u32 of a bit fresher version). Thank you!

Except for one thing: it doesn't react on receiving the same packet consequentially due to

Code: Select all

   If (NewReceived = LastReceived)
      Return
   LastReceived := NewReceived
part, which if I comment out - then I receive notification again and again in a loop after the first received packet.
Is there a way to fix that? Maybe flush some variables and some null something by VarSetCapacity(,,0)?
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

29 Oct 2013, 07:30

Testing on XP and AHK 1.1 U32 just now, I get no repeated messages for incoming packets, if I comment this part out. Only if the same packets are received repeatedly, messages are repeated too.
kidbit
Posts: 168
Joined: 02 Oct 2013, 16:05

Re: Help with a script to listen to a port

29 Oct 2013, 08:15

just me, oops, my bad.
I've just found out that the android util I use to wake up my PC (that sends magic packets) actually sends 5 of them at once.
So every time I used it - I g0t 5 message boxes. So the script is working correctly and even capable of working with queries, which is extra awesome.

Now for the message:
I always get this text яяяяяя, even when packets actually differ (I use wake-on-lan util where I can specify the target's MAC)
wikipedia wrote:The magic packet is a broadcast frame containing anywhere within its payload 6 bytes of all 255 (FF FF FF FF FF FF in hexadecimal), followed by sixteen repetitions of the target computer's 48-bit MAC address, for a total of 102 bytes.
Why does the script show only those 6 bytes? (probably hexed FF stands for я), where are the other 96 bytes?
question := (2b) || !(2b) © Shakespeare.
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Help with a script to listen to a port

29 Oct 2013, 10:01

Code: Select all

If ((RecvLen := NumGet(Arg, "UInt")) > 0) {
   VarSetCapacity(Buffer, RecvLen, 0)
   VarSetCapacity(FromBuffer, 16, 0)
   FromBufferLen := 16
   Result := DllCall("Ws2_32.dll\recvfrom", "Ptr", RecvSocket, "Ptr", &Buffer, "UInt", RecvLen
                                          , "UInt", 0, "Ptr", &FromBuffer, "IntP", FromBufferLen, "Int")
   ToolTip, %Result% ; add this line please
  ...
What does the ToolTip show? The packet might contain binary data.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: No registered users and 298 guests