TCP-Beispiel Programm

  • Hallo Community
    Das ich hier neu bin, Habe ich mir gedacht:

    Tue ich etwas für die Member (Leute), Die nicht so Gut TCP können
    Gesagt, Getan:
    Im Anhang und im Spoiler ist ein Beispiel TCP-Programm

    Server:

    Spoiler anzeigen
    [autoit]


    TCPStartup() ;TCP Dienst starten

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

    $sIP = @IPAddress1
    $iPort = 807

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

    Global $hSocket = TCPListen($sIP, $iPort) ;TCP-Socket erstellen
    Global $sRecv = "" ;Variabel für die Empfangenen Daten
    Global $iAccept = 0

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

    $sFormatString = "Server erfolgreich Erstellt\n\n IP-Adresse: %s\nPort: %i"
    MsgBox(64, "TCP-Server Programm", StringFormat($sFormatString, $sIP, $iPort)) ;Infos über den Server anzeigen

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

    While 1
    $iAccept = _TCP_Accept($hSocket) ;Mögliche Verbindungen zulassen
    While 1
    $sRecv = _TCP_Recv($iAccept) ;Daten empfangen
    If $sRecv = "CloseServer" Then _End() ;Server Beenden
    If $sRecv = "CloseCon" Then ExitLoop ;Verbindung zum Clienten schliessen
    If $sRecv <> "" Then
    $sFormatString = "Daten empfangen\nVon IP: %s\n\n%s"
    MsgBox(64, "Daten empfangen", StringFormat($sFormatString, _TCP_SocketToIP($iAccept), $sRecv)) ;Text anzeigen
    EndIf
    WEnd
    WEnd

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

    Func _TCP_Accept($iFunc_Socket = 0) ;Verbidungs-Funktion
    Local $iReturn
    Do
    $iReturn = TCPAccept($iFunc_Socket)
    Until $iReturn <> -1
    Return $iReturn
    EndFunc ;==>_TCP_Accept

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

    Func _TCP_Recv($iFunc_Socket = 0) ;Funktion zum Gebufferten Empfangen
    Local $sReturn
    While 1
    $sReturn &= TCPRecv($iFunc_Socket, 10)
    If @error Then ExitLoop
    WEnd
    Return $sReturn
    EndFunc ;==>_TCP_Recv

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

    Func _TCP_SocketToIP($SHOCKET) ;Socket -> IP Funktion
    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
    Return $aRet
    EndFunc ;==>_TCP_SocketToIP

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

    Func _End() ;Beenden-Funktion
    TCPCloseSocket($iAccept)
    TCPCloseSocket($hSocket)
    TCPShutdown()
    Exit
    EndFunc ;==>_End

    [/autoit]

    Und der Client:

    Spoiler anzeigen
    [autoit]


    TCPStartup() ;TCP Dienst starten

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

    $sServerIP = InputBox("TCP-Client Programm", "Bitte geben sie die IP-Adesse des Servers ein!", @IPAddress1, " M", 215, 150) ;Server-IP abfragen
    If @error Then _End() ;Bei Fehler, Beenden

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

    $iServerPort = InputBox("TCP-Client Programm", "Server-Port angeben (Normal 807)", "807", " M", 215, 150) ;Server-Port abfragen
    If @error Then _End() ;Bei Fehler, Beenden

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

    If (Not Ping($sServerIP)) Then ;Server-PC nicht Online
    MsgBox(16, "TCP-Client Programm", "Der Server-Rechner ist anscheinend nicht Online!")
    _End()
    EndIf

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

    Global $hSocket = TCPConnect($sServerIP, $iServerPort)
    If @error Then ;Mit Server kann nicht Verbunden werden
    MsgBox(16, "TCP-Client Programm", "Es konnte keine Verbindung mit dem Server hergestellt werden!")
    _End()
    EndIf

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

    $sFormatString = "Befehl/Text eingeben:\n\n!Exit = Beendet den Clienten\n!ExitServer = Beendet den Server\n!Close = Schliesst die Verbindung"

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

    While 1
    $sCommand = InputBox("TCP-Client Programm", StringFormat($sFormatString, ""), "", " M", 215, 200) ;Eingabe für User
    If @error Then _End()

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

    Switch $sCommand
    Case "!Exit"
    _End()
    Case "!ExitServer"
    TCPSend($hSocket, "CloseServer")
    Case "!Close"
    TCPSend($hSocket, "CloseCon")
    Case Else
    TCPSend($hSocket, $sCommand)
    EndSwitch
    WEnd

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

    Func _End()
    TCPCloseSocket($hSocket)
    TCPShutdown()
    Exit
    EndFunc ;==>_End

    [/autoit]

    Und nochmal als Download: autoit.de/wcf/attachment/7422/

    Viel Spaß damit, Und ja: AutoIt ist wirklich neu für Mich!
    PS: An die Profis: Ist meine Code-Struktur so in Ordnung?

  • Ich denke mal das wird er schon gemacht haben - er hat sicherlich einfach nur das selbe Phänomen wie ich:
    Wenn ich im Editor-Mode Quelltext einfüge und dann auf Vorschau klicke sieht die Vorschau zwar noch gut aus - im Code selbst hat er jedoch alle Einrückungen entfernt.
    Heißt: klicke ich nun auf absenden oder wieder auf Vorschau wird der Post ohne Einrückungen dargestellt.

  • AspirinJunkie

    Genau das Problem habe ich auch!
    Sehr Komisch, Naja ich versuche es mal zu Ordnern per STRG+T und Stelle es erneut rein!

    Funktioniert es den bei euch?

  • Also meine Erfahrung war bis jetzt:
    Internet Explorer entfernt die einrückungen
    Firefox funktioniert einwandfrei
    Safari kanns garnet da wird alles in eine zeile geschrieben
    ja und mit Opera (den ich aktuell nutze) funktionierts auch einwandfrei...

  • Das ganze tritt bei mir sowohl bei FF als auch bei Opera auf. (jeweils die aktuellste Version)
    IE, Chrome und Safari habe und werde ich nicht testen.
    Auch vom BS scheint dies unabhängig zu sein da es von XP über Vista bis hin zu Win7 x64 auftritt.
    Keine Ahnung an was es noch liegen könnte.