tcp server / client

  • Hi leute,
    ich möchte ein spiel mit autoit schreiben das über tcp an nen server connectet...
    aber ich bekomms einfach nicht gebacken :(

    die dateien sollen eig. folgendes machen:

    server:

    bekommt string
    arbeitet ne funktion ab
    schickt nen string zurück

    client:

    schickt was am server
    wartet bis ne antwort kommt
    arbeitet mit der antwort weiter

    das ganze sollte natürlich mit unbestimmt vielen clients laufen....
    und der client sollte auch nicht nur einmal was senden können und dann neu gestartet werden müssen...

    ich bekomms einfach nich hin :( bin jetzt scho 3 tage am basteln aber ich schaffs einfach nicht...

    könnte mir bitte jemand 2 beispielscripte machen?

    EDIT: Meine Versuche sin als dateianhänge dabei...

    mfg
    Icynator

  • besser wäre es wenn du uns deine scripte postest und wir helfen dir bei dem was du nicht ganz hinbekommst.
    dann kapierst dus evtl und kannst dein script alleine erweitern und aufbaun ;)

  • Mag jetzt stark nach ner ausrede klingen aber ich hab die alle wieder gelöscht :(

    ich glaub auch das ich die scripte versteh wenn mir jemand was postet ;)

    aber ich versuchs nochmal und poste meine versuche dann ^^

  • Edit: Dein Server den du geschrieben hast, hat folgendes Problem:
    Du speicherst die einzelnen verbundenen Clients nicht, du brachst für jeden eine eigene Variable, am Besten würde sich hier ein Array eignen
    (vl 2 dimensional:
    $Array[0][0] = Socket
    $Array[0][1] = IP
    $Array[0][2] = Name falls es sowas gibt
    usw...

    Nunja, am einfachsten wäre es du schaust dir die Funktion "AdlibRegister" mal an..

    Mit der müsstest du das einigermaßen hinbekommen..
    Ich denk da an sowos in der Art:

    Server:

    1 Adlibfunktion die alle 250 ms (oder auch andere Zeit) schaut, ob ein neuer Client connecten will und
    1 Adlibfunktion die alle 250 ms (oder auch andere Zeit) schaut, ob ein Client was schickt (Clients in Array speichern, mit For-Schleife durchgehen)
    in der 2. Funktion müsste dann noch ein Switch - Endswitch drinnen sein, der guckt um was für eine Nachricht es sich den handelt (ka was dein Spiel macht) und je nachdem was drinnen steht, wird ein anderer Case abgearbeitet und schickt an den jenigen Client etwas zurück..

    Client:

    entweder du machst auch hier eine Adlibfunktion oder du lässt ihn einfach warten nachdem du etwas geschickt hast. Dann besteht allerdings die Gefahr, falls in dieser Zeit die Verbindung unterbrochen wird, dass du im Programm festsitzt und nichts mehr reagiert..

    Viel Spaß beim Tüfteln, falls du was nicht verstehst einfach fragen ;)

  • Client
    [autoit]


    #include <GUIConstantsEx.au3>
    TCPStartUp ()
    $Nick = InputBox("Nick Name","Wie willst du im Chat heißen")
    If @error Then Exit

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

    $Ip2 = TCPNameToIP("icynator.ath.cx")

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

    $Socket = TCPConnect(@IPAddress1,3333)
    If @error Then
    $Socket = TCPConnect($Ip2 ,3333)
    If @error Then Exit
    EndIf

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

    $Form1 = GUICreate("Chat", 625, 445, 192, 124)
    $Edit1 = GUICtrlCreateEdit("", 56, 16, 505, 265)
    $Input1 = GUICtrlCreateInput("", 64, 336, 401, 21)
    $Button1 = GUICtrlCreateButton("Send", 488, 336, 97, 25, 0)
    $Button2 = GUICtrlCreateButton("X", 592, 0, 25, 17, 0)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    ;~ $Client2 = TCPConnect ($Ip2,3333)
    TCPSend ($Socket,$Nick & ":"& GUICtrlRead($Input1))
    ;~ ControlClick ("","",$Edit1)
    ; GUICtrlSetData($Edit1,GUICtrlRead($Input1),1)
    ;~ Send(" {Enter}",0)
    Case $Button2
    Exit
    EndSwitch

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

    ;~ $Client = TCPAccept($Server)
    ;~ if $Client >= 0 Then
    $Message = TCPRecv($Client,2048)
    ;~ ControlClick ("","",$Edit1)
    GUICtrlSetData($Edit1,$Message,1)
    EndIf
    WEnd

    [/autoit]
    Server
    [autoit]


    #include <GUIConstantsEx.au3>

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

    ;~ Server Ip
    $MaxConnect = 100
    TCPStartup()
    $Socket = TCPListen(@IPAddress1, 3333, $MaxConnect) ;~ für 100 Clients

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

    Dim $Verbindung[$MaxConnect]
    For $x = 0 To UBound($Verbindung) - 1
    $Verbindung[$x] = -1
    Next

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

    While 1
    For $x = 0 To UBound($Verbindung) - 1
    If $Verbindung[$x] = -1 Then
    $Verbindung[$x] = TCPAccept($Socket)
    EndIf

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

    If $Verbindung[$x] <> -1 Then
    $Resv = TCPRecv($Verbindung[$x], 2048)
    If @error Then
    TCPCloseSocket($Verbindung[$x])
    $Verbindung[$x] = -1
    EndIf
    If $Resv <> "" Then
    For $y = 0 To UBound($Verbindung) - 1
    If $Verbindung[$y] <> -1 Then TCPSend($Verbindung[$y], $Resv)
    Next
    EndIf
    EndIf
    Next
    WEnd

    [/autoit]

    Es müsste laufen wenn nicht sag was es errort xD

  • #include <GUIConstantsEx.au3> ;~ Server Ip $MaxConnect = 100 TCPStartup() $Socket = TCPListen(@IPAddress1, 3333, $MaxConnect) ;~ für 100 Clients Dim $Verbindung[$MaxConnect] For $x = 0 To UBound($Verbindung) - 1 $Verbindung[$x] = -1 Next While 1 For $x = 0 To UBound($Verbindung) - 1 If $Verbindung[$x] = -1 Then $Verbindung[$x] = TCPAccept($Socket) EndIf If $Verbindung[$x] <> -1 Then $Resv = TCPRecv($Verbindung[$x], 2048) If @error Then TCPCloseSocket($Verbindung[$x]) $Verbindung[$x] = -1 EndIf If $Resv <> "" Then For $y = 0 To UBound($Verbindung) - 1 If $Verbindung[$y] <> -1 Then TCPSend($Verbindung[$y], $Resv) Next EndIf EndIf Next WEnd

    kommt n error xD

    I:\AutoIt Projekte\Game\Client.au3(43,39) : WARNING: $Client: possibly used before declaration.
    $Message = TCPRecv($Client,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    I:\AutoIt Projekte\Game\Client.au3(43,39) : ERROR: $Client: undeclared global variable.
    $Message = TCPRecv($Client,