Hallo zusammen,
ich habe ein Scriptgeschrieben das als TCP Server einen Port öffnet, wenn ich es als Nutzer meines Rechners starte Funktioniert auch alles super so wie ich es will. Dann habe ich nach einer möglichkeit gesucht diesen Server als Dienst zu Installieren, und dies hier gefunden
http://www.autoitscript.com/forum/index.php?s=068720af1a61546ee7b8367c5782d490&showtopic=80201&st=0
ich habe den Dienst dann auch schon unter Verschiedenen Konten laufen lassen, nur öffnet er mir nie meinen Port.
ich habe auch mal ein par logzeilen eingebaut die Schleifen die ich eingebaut habe im main() funtionieren auch tatsächlich.
hat jemand von euche eine Idee warum das nicht funktioniert?
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Version=Beta
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; Example of using service UDF to make an exe possibly runeed as a service
; By Arcker
; 10/09/2008
#include <GUIConstantsEx.au3>
#include <Constants.au3>
;#include <incPrivateRPC.au3>
#include<Service.au3>
#include <File.au3>
Dim $szIPADDRESS = IniRead("Server.ini", "Settings", "IP", "")
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $szIPADDRESS = ' & $szIPADDRESS & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
Dim $nPORT = IniRead("Server.ini", "Settings", "Port", "")
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $nPORT = ' & $nPORT & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
Dim $sComputerName = @ComputerName
Dim $sServiceName = "PrivateRPCServer"
Dim $sServiceUser, $sPassword
If $cmdline[0] > 0 Then
Switch $cmdline[1]
Case "install", "-i", "/i"
InstallService()
Case "remove", "-u", "/u", "uninstall"
RemoveService()
Case Else
ConsoleWrite(" - - - Help - - - " & @crlf)
ConsoleWrite("params : " & @crlf)
ConsoleWrite(" -i : install service" & @crlf)
ConsoleWrite(" -u : remove service" & @crlf)
ConsoleWrite(" - - - - - - - - " & @crlf)
Exit
;start service.
EndSwitch
EndIf
_Service_init($sServiceName)
func main()
while 1
;doing what you want here
;msgbox(0,"","ok")
Local $MainSocket, $ConnectedSocket, $szIP_Accepted
Local $recv, $slash, $values, $iniSectionCMD
TCPStartup()
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
If $MainSocket = -1 Then Exit
While 1
_FileWriteLog("C:\log.txt","While loop") ; zum testen eingefügt
$ConnectedSocket = -1
Do
$ConnectedSocket = TCPAccept($MainSocket)
Sleep(500)
_FileWriteLog("C:\log.txt","Do loop") ; zum testen eingefügt
Until $ConnectedSocket <> -1
$szIP_Accepted = SocketToIP($ConnectedSocket)
;Removed Code
WEnd
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()
Sleep(1000)
WEnd
EndFunc
Func InstallService()
ConsoleWrite("Installing service, please wait" & @CRLF)
_Service_Create("", $sServiceName, "Autoit Service Test", '"' & @ScriptFullPath & '"')
If @error Then
ConsoleWrite("Problem installing service, Error number is " & @error & @CRLF & " message : " & _WinAPI_GetLastErrorMessage())
Else
ConsoleWrite("Installation of service successful")
EndIf
Exit
EndFunc ;==>InstallService
Func RemoveService()
_StopService("", $sServiceName)
_DeleteService("", $sServiceName)
if not @error then ConsoleWrite("service removed successfully" & @crlf)
Exit
EndFunc ;==>RemoveService
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
[/autoit] [autoit][/autoit] [autoit]Return $aRet
EndFunc ;==>SocketToIP
EDIT:
Fehler gefunden wenn das script als Dienst läuft ist das Arbeitsverzeichnis eine anderens und der Zugriff auf die Settings.ini war somit nicht mehr möglich durch eine absolute Phadangabe wurde das Probelm beseitigt.
Dennoch danke für die Hilfeversuche.
Somit ist aber auch Klar das mit dem Service.au3 UDF durchaus auch ein Netzwerkdienst möglich ist.