diff --git a/ConnectionTest.pbp b/ConnectionTest.pbp new file mode 100644 index 0000000..3f798f0 --- /dev/null +++ b/ConnectionTest.pbp @@ -0,0 +1,74 @@ + + + +
+ +
+
+ + + +
+
+ + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/LICENSE b/LICENSE index 2dbc93c..0e77731 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 -Copyright © 2007 Free Software Foundation, Inc. +Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. diff --git a/Main.pb b/Main.pb new file mode 100644 index 0000000..f60c3af --- /dev/null +++ b/Main.pb @@ -0,0 +1,408 @@ +EnableExplicit +XIncludeFile "Wnd.pbf" + +If Not InitNetwork() + MessageRequester("Fehler", "Netzwerkfehler") + End +EndIf + +Macro Version() + "V" + Str(1) + "." + FormatDate("%yy%mm.%dd", Date()) + Str(#PB_Editor_BuildCount) + "." + Str(#PB_editor_CompileCount) +EndMacro + +Enumeration Events #PB_Event_FirstCustomValue + #EVENT_ThreadFinished +EndEnumeration + +Enumeration Menu + #MENU_PopUp +EndEnumeration + +Enumeration MenuItem + #MENUITEM_Copy + #MENUITEM_Cut + #MENUITEM_Paste + #MENUITEM_SelectAll + #MENUITEM_Undo +EndEnumeration + + +Structure ThreadData + ID.i + Exit.i + Url.s + Query.s + Format.i + Modus.i + GetRaw.i + Timeout.i + Interval.i +EndStructure + +Global ThreadData.ThreadData +Global PopupMenuGadget + +Procedure WriteLog(String.s, TimeStamp = #True) + + If TimeStamp + AddGadgetItem(#EDIT_Log, -1, FormatDate("%yy-%mm-%dd %hh:%ii:%ss -> ", Date()) + String) + Else + AddGadgetItem(#EDIT_Log, -1, String) + EndIf + + CompilerIf #PB_Compiler_OS = #PB_OS_Windows + ; NICHT in der DEMO-Version + SendMessage_(GadgetID(#EDIT_Log), #EM_SETSEL, -1, -1) ; Automatisch weiter scrollen + CompilerEndIf + + +; While WindowEvent() : Wend ; Quick'n Dirty +EndProcedure +Procedure.s CheckUrl(Url.s) + + If FindString(Url, "://", 1, #PB_String_NoCase) < 1 + Url = "none://" + Url + EndIf + + ProcedureReturn Url +EndProcedure +Procedure.s GetQuery() + Protected Ret.s + + Ret = GetGadgetText(#EDIT_Own) + Ret = RemoveString(Ret, #CR$) + Ret = RemoveString(Ret, #LF$) + Ret = UnescapeString(Ret) + + ProcedureReturn Ret +EndProcedure + +Procedure.s ReceiveHTTP(Url.s, Format = #PB_UTF8) + Protected Ret.s, *RecData, Size + + WriteLog("Anfrage " + Url + " senden ...") + *RecData = ReceiveHTTPMemory(Url) + + If *RecData + Size = MemorySize(*RecData) + Ret = PeekS(*RecData, Size, Format) + WriteLog(Str(Size) + " Bytes empfangen") + Else + WriteLog("Verbindungsfehler") + EndIf + + ProcedureReturn Ret +EndProcedure +Procedure.s ReceiveRaw(Url.s, Query.s, Format = #PB_UTF8, Modus = #PB_Network_TCP|#PB_Network_IPv4, TimeOut = 5000) + Protected Server.s, Port, *Query, QueryBytes + Protected NetID, Bytes, *Buff, StartTime, Ret.s + + Url=CheckUrl(Url) + + Server.s = GetURLPart(Url, #PB_URL_Site) + Port = Val(GetURLPart(Url, #PB_URL_Port)) + If Port = 0 + Port = 80 + EndIf + + QueryBytes = StringByteLength(Query, Format) + *Query = AllocateMemory(QueryBytes + 2) + If *Query + PokeS(*Query, Query, -1, Format) + *Buff = AllocateMemory(100000) ; 100 KB Puffer + If *Buff + WriteLog("Verbinde mit " + Server + ":" + Str(Port) + " ...") + NetID = OpenNetworkConnection(Server, Port, Modus, TimeOut) + If NetID + WriteLog("Verbindung erfolgreich") + WriteLog("Sende Anfrage ...") + Bytes = SendNetworkData(NetID, *Query, QueryBytes) + WriteLog(Str(Bytes) + " Bytes gesendet") + WriteLog("Warte " + Str(TimeOut) + " ms auf Antwort ...") + Bytes = 0 + StartTime = ElapsedMilliseconds() + Repeat + Select NetworkClientEvent(NetID) + Case #PB_NetworkEvent_Data + WriteLog("Empfange Daten ...") + Bytes = ReceiveNetworkData(NetID, *Buff, MemorySize(*Buff)) + If Bytes + WriteLog(Str(Bytes) + " Bytes empfangen") + Ret = PeekS(*Buff, Bytes, Format|#PB_ByteLength) + Break + EndIf + Case #PB_NetworkEvent_Disconnect + WriteLog("Verbindung wurde getrennt") + Break + Default + If (ElapsedMilliseconds() - StartTime) > TimeOut + WriteLog("Timeout erreicht") + Break + Else + Delay(5) + EndIf + EndSelect + ForEver + CloseNetworkConnection(NetID) + Else + WriteLog("Verbindung fehlgeschlagen") + EndIf + + FreeMemory(*Buff) + Else + WriteLog("Nicht genug freier Speicher") + Debug "ReceiveRaw: Nicht genug freier Speicher" + EndIf + + FreeMemory(*Query) + Else + WriteLog("Nicht genug freier Speicher") + Debug "ReceiveRaw: Nicht genug freier Speicher" + EndIf + + ProcedureReturn Ret +EndProcedure + +Procedure THREAD_Receive(*TData.ThreadData) + Protected Ret.s, StartTime = ElapsedMilliseconds(), Run = #True, Loop + With *TData + Repeat + + ; Abrufen + If Run + WriteLog(RSet(#Empty$, 20, "=") + " AbfrageNr.: " + Str(Loop) + " " + RSet(#Empty$, 20, "="), #False) + If \GetRaw + Ret = ReceiveRaw(\Url, \Query, \Format, \Modus, \Timeout) + Else + Ret = ReceiveHTTP(\Url, \Format) + EndIf + + If Ret <> #Empty$ + WriteLog("Antwort vom Server: ") + WriteLog(RSet(#Empty$, 25, "-"), #False) + WriteLog(Ret, #False) + WriteLog(RSet(#Empty$, 25, "-"), #False) + EndIf + Run = #False + EndIf + + ; Intervallrechnung + If \Interval > 0 + If (ElapsedMilliseconds() - StartTime) > \Interval + Loop + 1 + Run = #True + StartTime = ElapsedMilliseconds() + EndIf + Else ; kein Interval, keine Wiederholung + Break + EndIf + + ; Beenden-Anforderung, Resourcen freigeben + If \Exit + Break + Else + Delay(10) + EndIf + + ForEver + EndWith + PostEvent(#EVENT_ThreadFinished, #WND, #Null) +EndProcedure +Procedure ThreadCleanUp() + DisableGadget(#BTN_Start, #True) + If ThreadData\ID + ThreadData\Exit = #True + If IsThread(ThreadData\ID) + WriteLog("Warte auf Thread ...") + If WaitThread(ThreadData\ID, ThreadData\Timeout) = 0 + WriteLog("Kill Thread ...") + KillThread(ThreadData\ID) + EndIf + EndIf + WriteLog(">>>>>>>>>> Thread beendet <<<<<<<<<<") + EndIf + ResetStructure(@ThreadData, ThreadData) + DisableGadget(#BTN_Start, #False) +EndProcedure + +Procedure CALLBACK_Gadgets() + Protected EventType = EventType() + Protected EventGadget = EventGadget() + + Select EventGadget + Case #BTN_Start + If GetGadgetState(#BTN_Start) + If GetGadgetState(#CHK_Repeat) + ThreadData\Interval = GetGadgetState(#SPIN_ms) + SetGadgetText(#BTN_Start, "STOP") + Else + ThreadData\Interval = 0 + SetGadgetState(#BTN_Start, #False) + EndIf + ThreadData\Exit = #False + ThreadData\Url = GetGadgetText(#STR_Url) + ThreadData\Format = #PB_UTF8 + ThreadData\GetRaw = GetGadgetState(#OPT_Own) + ThreadData\Modus = #PB_Network_TCP|#PB_Network_IPv4 + ThreadData\Query = GetQuery() + ThreadData\Timeout = 10000 + ThreadData\ID = CreateThread(@THREAD_Receive(), @ThreadData) + WriteLog(">>>>>>>>>> Starte Thread ... <<<<<<<<<<") + Else + ThreadData\Exit = #True ;ThreadCleanUp() + SetGadgetText(#BTN_Start, "START") + EndIf + + + Case #BTN_DelLog + SetGadgetText(#EDIT_Log, #Empty$) + + Case #EDIT_Info + If EventType = #PB_EventType_RightClick + PopupMenuGadget = EventGadget + DisableMenuItem(#MENU_PopUp, #MENUITEM_Cut, #True) + DisableMenuItem(#MENU_PopUp, #MENUITEM_Paste, #True) + DisableMenuItem(#MENU_PopUp, #MENUITEM_Undo, #True) + DisplayPopupMenu(#MENU_PopUp, WindowID(#WND)) + EndIf + + Case #EDIT_Log + If EventType = #PB_EventType_RightClick + PopupMenuGadget = EventGadget + DisableMenuItem(#MENU_PopUp, #MENUITEM_Cut, #True) + DisableMenuItem(#MENU_PopUp, #MENUITEM_Paste, #True) + DisableMenuItem(#MENU_PopUp, #MENUITEM_Undo, #True) + DisplayPopupMenu(#MENU_PopUp, WindowID(#WND)) + EndIf + + Case #EDIT_Own + If EventType = #PB_EventType_RightClick + PopupMenuGadget = EventGadget + DisableMenuItem(#MENU_PopUp, #MENUITEM_Cut, #False) + DisableMenuItem(#MENU_PopUp, #MENUITEM_Paste, #False) + DisableMenuItem(#MENU_PopUp, #MENUITEM_Undo, #False) + DisplayPopupMenu(#MENU_PopUp, WindowID(#WND)) + EndIf + + + Default + If GetGadgetState(#CHK_Repeat) + DisableGadget(#SPIN_ms, #False) + Else + DisableGadget(#SPIN_ms, #True) + EndIf + + If GetGadgetState(#OPT_Own) + DisableGadget(#EDIT_Own, #False) + Else + DisableGadget(#EDIT_Own, #True) + EndIf + + EndSelect + +EndProcedure +Procedure CALLBACK_Menu() + + Select EventMenu() + + Case #MENUITEM_Undo + SendMessage_(GadgetID(PopupMenuGadget), #WM_UNDO, 0, 0) + + Case #MENUITEM_Cut + SendMessage_(GadgetID(PopupMenuGadget), #WM_CUT, 0, 0) + + Case #MENUITEM_Copy + SendMessage_(GadgetID(PopupMenuGadget), #WM_COPY, 0, 0) + + Case #MENUITEM_Paste + SendMessage_(GadgetID(PopupMenuGadget), #WM_PASTE, 0, 0) + + Case #MENUITEM_SelectAll + ;lang = Len(GetGadgetText(EventGadget)) + SendMessage_(GadgetID(PopupMenuGadget), #EM_SETSEL, 0, -1) + + EndSelect + +EndProcedure +Procedure CALLBACK_Wnd(hWnd, Msg, wParam, lParam) + + If Msg = #WM_CONTEXTMENU + Select wParam + Case GadgetID(#EDIT_Info) + PostEvent(#PB_Event_Gadget, #WND, #EDIT_Info, #PB_EventType_RightClick) + Case GadgetID(#EDIT_Own) + PostEvent(#PB_Event_Gadget, #WND, #EDIT_Own, #PB_EventType_RightClick) + Case GadgetID(#EDIT_Log) + PostEvent(#PB_Event_Gadget, #WND, #EDIT_Log, #PB_EventType_RightClick) + EndSelect + EndIf + + ProcedureReturn #PB_ProcessPureBasicEvents +EndProcedure + +Procedure Create_WND() + + ; Fenster öffnen und Standartwerte setzen + OpenWND() + SetWindowTitle(#WND, "Connection Test " + Version()) + WindowBounds(#WND, WindowWidth(#WND), WindowHeight(#WND), #PB_Ignore, #PB_Ignore) + BindEvent(#PB_Event_SizeWindow, @ResizeGadgetsWND(), #WND) + BindEvent(#PB_Event_Gadget, @CALLBACK_Gadgets(), #WND) + BindEvent(#PB_Event_Menu, @CALLBACK_Menu(), #WND) + BindEvent(#EVENT_ThreadFinished, @ThreadCleanUp(), #WND) + SetWindowCallback(@CALLBACK_Wnd(), #WND) + CALLBACK_Gadgets() + SetGadgetText(#EDIT_Own,"GET /file.xxx HTTP/1.1\r\n" + #LF$ + + "Host: server\r\n" + #LF$ + + "Connection: close\r\n" + #LF$ + + ;"User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0" + #LF$ + + "\r\n\r\n") + SetGadgetState(#OPT_Internal, #True) + SetGadgetState(#CHK_Repeat, #False) + SetGadgetState(#SPIN_ms, 5000) + + + + If CreatePopupMenu(#MENU_PopUp) + MenuItem(#MENUITEM_Undo, "Rückgängig") + MenuBar() + MenuItem(#MENUITEM_Copy, "Kopieren") + MenuItem(#MENUITEM_Cut, "Ausschneiden") + MenuItem(#MENUITEM_Paste, "Einfügen") + MenuBar() + MenuItem(#MENUITEM_SelectAll, "Alles Auswählen") + EndIf + + ; Info hinzufügen + AddGadgetItem(#EDIT_Info, -1, "Escape-Sequenzen:") + AddGadgetItem(#EDIT_Info, -1, ~"\\a\tAscii: 7\tBeep") + AddGadgetItem(#EDIT_Info, -1, ~"\\b\tAscii: 8\tBackSpace") + AddGadgetItem(#EDIT_Info, -1, ~"\\t\tAscii: 9\tH-Tab") + AddGadgetItem(#EDIT_Info, -1, ~"\\n\tAscii: 10\tLineFeed") + AddGadgetItem(#EDIT_Info, -1, ~"\\v\tAscii: 11\tV-Tab") + AddGadgetItem(#EDIT_Info, -1, ~"\\f\tAscii: 12\tFormFeed") + AddGadgetItem(#EDIT_Info, -1, ~"\\r\tAscii: 13\tCarriageReturn") + AddGadgetItem(#EDIT_Info, -1, ~"\\\"\tAscii: 34\tDoubleQuote") + AddGadgetItem(#EDIT_Info, -1, ~"\\\\\tAscii: 92\tBackSlash") + +EndProcedure + +;_ INIT +Create_WND() +HideWindow(#WND, #False) + +;_ MAIN +Repeat +Until WaitWindowEvent() = #PB_Event_CloseWindow + +;Aufräumen +HideWindow(#WND, #True) +ThreadCleanUp() +; IDE Options = PureBasic 5.62 (Windows - x86) +; CursorPosition = 9 +; Folding = LA9 +; EnableXP +; CompileSourceDirectory +; EnableCompileCount = 0 +; EnableBuildCount = 0 +; EnableExeConstant \ No newline at end of file diff --git a/README.md b/README.md index 7650b5d..52b42f5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# ConnectionTest +# ConnectionTest / iConnTest + diff --git a/Wnd.pbf b/Wnd.pbf new file mode 100644 index 0000000..56b7aff --- /dev/null +++ b/Wnd.pbf @@ -0,0 +1,71 @@ +; Form Designer for Purebasic - 5.62 +; Warning: this file uses a strict syntax, if you edit it, make sure to respect the Form Designer limitation or it won't be opened again. + +; +; This code is automatically generated by the FormDesigner. +; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled. +; Event procedures needs to be put in another source file. +; + +Enumeration FormWindow + #WND +EndEnumeration + +Enumeration FormGadget + #FRM_Url + #STR_Url + #FRM_Connect + #TXT_ms + #SPIN_ms + #CHK_Repeat + #OPT_Internal + #OPT_Own + #FRM_Log + #EDIT_Log + #BTN_Start + #EDIT_Own + #EDIT_Info + #Splitter_0 + #BTN_DelLog +EndEnumeration + +Declare ResizeGadgetsWND() + + +Procedure OpenWND(x = 0, y = 0, width = 490, height = 370) + OpenWindow(#WND, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_Invisible | #PB_Window_TitleBar | #PB_Window_ScreenCentered) + FrameGadget(#FRM_Url, 10, 0, 470, 50, "Url") + StringGadget(#STR_Url, 20, 20, 450, 20, "Server/IP[:Port][/file.xxx]") + FrameGadget(#FRM_Connect, 10, 50, 470, 180, "Abfrage") + TextGadget(#TXT_ms, 420, 100, 30, 20, "ms") + SpinGadget(#SPIN_ms, 330, 100, 80, 20, 1, 99999, #PB_Spin_Numeric) + CheckBoxGadget(#CHK_Repeat, 310, 70, 160, 25, "Automatisch Wiederholen") + OptionGadget(#OPT_Internal, 20, 70, 250, 25, "Interne/cUrl Funktionen verwenden (HTTP)") + OptionGadget(#OPT_Own, 20, 100, 110, 25, "Eigene Abfrage:") + FrameGadget(#FRM_Log, 10, 230, 380, 130, "Log") + EditorGadget(#EDIT_Log, 20, 250, 360, 100, #PB_Editor_ReadOnly) + ButtonGadget(#BTN_Start, 400, 240, 80, 40, "Start", #PB_Button_Toggle) + EditorGadget(#EDIT_Own, 20, 130, 250, 90) + EditorGadget(#EDIT_Info, 279, 130, 191, 90, #PB_Editor_ReadOnly) + SplitterGadget(#Splitter_0, 20, 130, 450, 90, #EDIT_Own, #EDIT_Info, #PB_Splitter_Vertical) + SetGadgetState(#Splitter_0, 250) + ButtonGadget(#BTN_DelLog, 400, 290, 80, 30, "Log löschen") +EndProcedure + +Procedure ResizeGadgetsWND() + Protected FormWindowWidth, FormWindowHeight + FormWindowWidth = WindowWidth(#WND) + FormWindowHeight = WindowHeight(#WND) + ResizeGadget(#FRM_Url, 10, 0, FormWindowWidth - 20, 50) + ResizeGadget(#STR_Url, 20, 20, FormWindowWidth - 40, 20) + ResizeGadget(#FRM_Connect, 10, 50, FormWindowWidth - 20, 180) + ResizeGadget(#TXT_ms, FormWindowWidth - 70, 100, 30, 20) + ResizeGadget(#SPIN_ms, FormWindowWidth - 160, 100, 80, 20) + ResizeGadget(#CHK_Repeat, FormWindowWidth - 180, 70, 160, 25) + ResizeGadget(#FRM_Log, 10, 230, FormWindowWidth - 110, FormWindowHeight - 240) + ResizeGadget(#EDIT_Log, 20, 250, FormWindowWidth - 130, FormWindowHeight - 270) + ResizeGadget(#BTN_Start, FormWindowWidth - 90, 240, 80, 40) + ResizeGadget(#Splitter_0, 20, 130, FormWindowWidth - 40, 90) + ResizeGadget(#BTN_DelLog, GadgetWidth(#Splitter_0) - 50, 290, 80, 30) +EndProcedure +