TCP Problem

  • Hallöchen liebe Community,
    Ich habe einen Server und einen Client gescriptet. Der Server liefert die Daten und der Client liest sie dann aus.
    Der Server speichert die Daten als textfiles ab, der Client liest sie dann aus.
    Jetzt möchte ich, das man den Server über den Client steuern kann (Beenden, Neustarten und Daten aktualiseren). Dafür will ich TCP/IP nutzen
    Ich habe mir die Beispiele in der Hilfedatei angesehen und ich denke, soweit ist ist alles korrekt, ich kriege aber immer einen Timeout vom Client bei TCPConnect()
    Das Serverscript läuft auf einem Server, die Clients jeweils auf verschiedenen PC´s

    Hier die Teile vom Serverscript:

    Spoiler anzeigen
    [autoit]


    Dim $szIPADDRESS = @IPAddress1 ;192.168.1.10
    Dim $nPORT = 33891
    TCPStartUp()
    $MainSocket = TCPListen($szIPADDRESS, $nPORT, 1)
    $ConnectedSocket = -1

    [/autoit] [autoit][/autoit] [autoit]

    Switch @WDAY
    Case 2 To 6
    Switch @HOUR
    Case 8 To 21
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    If $ConnectedSocket <> -1 Then
    $clientconnected = 1
    ExitLoop
    EndIf
    Until @Min = $Minutes
    If $clientconnected = 1 Then
    Dim $szIP_Accepted = SocketToIP($ConnectedSocket)
    Dim $msg, $recv
    While 1
    $recv = TCPRecv( $ConnectedSocket, 2048 )
    If @min = $Minutes Then
    ExitLoop
    ElseIf $recv <> "" Then
    If $recv = "Shutdown" Then
    _FileWriteLog(@ScriptDir & "\server.log", "Server wurde heruntergefahren von "&$szIP_Accepted)
    TCPCloseSocket( $ConnectedSocket )
    TCPShutDown()
    Exit
    ElseIf $recv = "Restart" Then
    _FileWriteLog(@ScriptDir & "\server.log", "Server wurde neugestartet von "&$szIP_Accepted)
    TCPCloseSocket( $ConnectedSocket )
    TCPShutDown()
    Run (@ScriptName)
    Exit
    ElseIf $recv = "Refresh" Then
    _FileWriteLog(@ScriptDir & "\server.log", "Server Daten werden aktualisert. Refresh gestartet von "&$szIP_Accepted)
    ExitLoop
    EndIf
    EndIf
    WEnd
    EndIf
    EndSwitch
    Case Else
    Do
    Sleep(28800000)
    Until @WDAY = 2
    EndSwitch

    [/autoit]

    Und der Client:

    Spoiler anzeigen
    [autoit]


    Global $szIPADDRESS = "192.168.1.10", $nPORT = 33891
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Adminrefresh
    If $admin = 1 Then
    TCPStartup()
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    Else
    TCPSend($ConnectedSocket, "r3fr35h")
    If @error Then
    MsgBox(4112, "Error", "TCPSend failed with WSA error: " & @error)
    EndIf
    EndIf
    TCPShutdown()
    EndIf
    Case $Adminrestart
    If $admin = 1 Then
    TCPStartup()
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    Else
    TCPSend($ConnectedSocket, "r357ar7")
    If @error Then
    MsgBox(4112, "Error", "TCPSend failed with WSA error: " & @error)
    EndIf
    EndIf
    TCPShutdown()
    EndIf
    Case $Adminexit
    If $admin = 1 Then
    TCPStartup()
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    Else
    TCPSend($ConnectedSocket, "5hu7d0wn")
    If @error Then
    MsgBox(4112, "Error", "TCPSend failed with WSA error: " & @error)
    EndIf
    EndIf
    TCPShutdown()
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Der Error ist 10060 (Timeout)

    Kennt sich jemand damit aus?

  • Hi,
    schau mal hier

  • Hi,

    kurz vorweg; ist das Möglich:
    Case 2 To 6
    ? Ich habe so eine Schreibweise zuvor nie gesehen.
    Wenn ich den Kommentar im Server richtig verstehe, hat der Server und dein Client die gleiche IP? Das klappt nicht, zum testen brauchst du mindestens zwei verschiedene Rechner.

    Was mir noch beim Überfliegen des Servers aufgefallen ist:

    [autoit]

    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    If $ConnectedSocket <> -1 Then
    $clientconnected = 1
    ExitLoop
    EndIf
    Until @Min = $Minutes

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    $Minutes wurde nie vorher deklariert. Das kann aber auch daran liegen, dass du nur einen Ausschnitt gepostet hast.

    Aquaplant

  • Zu Case 2 To 6:
    kommt auf den Switch an, bei @WDay ja, kannst dir das Beispiel zu Switch ansehen
    Server und Client haben eine unterschiedliche IP, im client wird nur die ServerIP festgelegt
    $minutes wird deklariert ;), ist ja nur ein Ausschnitt

    Habe übrigens den Fehler gefunden, war die Firewall, die das Senden an den Server geblockt hat

  • Zitat

    Das klappt nicht, zum testen brauchst du mindestens zwei verschiedene Rechner.

    wieso das denn? Schon mal was von loopback-Adapter gehört?
    Genau für diese Fälle wurde der nämlich implementiert!
    Oder hast du keinen 127.0.0.1 auf deinem Rechner aktiv?

  • Wenn du dir die Beispiele für TCPIP, also Server und client, mal ansiehst und dann beide compilierst und ausführst, siehst du das es doch geht ;)
    Einzig SocketToIP im Beispiel liefert 0 zurück und nicht die IP Adresse, sonst gehts aber ;)