TCP/Input fragen^^

  • Also hier erstmal mein Server:

    Spoiler anzeigen
    [autoit]

    HotKeySet("{F5}","_exit")
    #include <INet.au3>
    #include <GUIConstants.au3>
    Dim $szIPADDRESS = _GetIP()
    Dim $nPORT = 21219
    TCPStartUp()
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)
    If $MainSocket = -1 Then
    MsgBox(0,"Server can´t start","")
    Exit
    EndIf
    Dim $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")",300,200)
    Dim $edit = GUICtrlCreateEdit("",10,10,280,180)
    GUISetState()
    Dim $ConnectedSocket = -1
    Do
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1
    Dim $szIP_Accepted = SocketToIP($ConnectedSocket)
    Dim $msg, $recv
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then Exit
    $recv = TCPRecv( $ConnectedSocket, 2048 )
    If $recv <> "" Then GUICtrlSetData($edit, _
    $szIP_Accepted & " : " & $recv & @CRLF & GUICtrlRead($edit))
    WEnd
    Func SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")
    Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
    "ptr",DLLStructGetPtr($sockaddr),"int_ptr",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
    Func _exit()
    Exit
    EndFunc

    [/autoit]

    Größtens Teils der aus dem Autoit wiki aber hallt shcon leicht zsm geschnitten.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    HotKeySet("{ENTER}","_enter")
    TCPStartUp()
    Dim $szIPADDRESS=TCPNameToip("xxx . dyndns .org";<---Hier steht meine Dyndns IP hab sie jetzt mal rausgemacht und leerzeichen rein wegem linkt
    Dim $nPORT = 21219
    Dim $ConnectedSocket = -1
    $ConnectedSocket = TCPConnect($szIPADDRESS,$nPORT)
    Dim $szData
    $Con1=0
    If @error then $Con1=1
    _CantCon()
    Func _CantCon()
    If $Con1=1 Then
    While 1
    MsgBox(0x0,"Cannot Connect","Cant Connect to Server on "&$szIPADDRESS&" on Port "&$nPORT&". New Trying will be started.",4)
    Sleep(2500)
    $ConnectedSocket = TCPConnect($szIPADDRESS,$nPORT)
    If not @error then
    ExitLoop
    $Con1=0
    EndIf
    WEnd
    EndIf
    EndFunc
    $GUI=GUICreate("Guiname",400,500)
    $Edit=GUICtrlCreateedit("",1,1,399,399)
    $Input=GUICtrlCreateInput("",1,400,399,99)
    GUISetState()
    $Enter=1
    Func _Enter()
    $Send=GUICtrlRead($Input)
    TCPSend($ConnectedSocket,$Send)
    If @error Then
    $Con1=1
    _CantCon()
    EndIf
    GUICtrlSetData($Input,"")
    GUICtrlSetData($Input,"")
    EndFunc
    While 1
    $msg=GUIGetMsg()
    If $msg=$GUI_EVENT_CLOSE then Exit
    Sleep(1000)
    WEnd

    [/autoit]


    Und das der Client.
    Wenn ich als IP einfach die Lokale nehme hallt bei Server und Client die 127.0.0.1 gehts. meine Netzwerk ip die 198.0.0.x geht auch.
    Nun wenn ich eben jetzt die blabla . dyndns.org adresse eingeben-->kommt mien Server can´t start
    bei den IP´s von wieistmeineip.de ebenfalls
    bei der IP von Ipconfig /all (dns ip)ebenfalls
    und bei _Getip() ebenfals^^
    was mache ich nun falsch xD
    Port ist freigegeben...
    -----------------------
    und nun zur Inputbox.
    Es soll ein Programm werden mit Person A Server Person B Client. Client B sendet Server A Befehle Server antwortet Client und führt Befehl aus.
    um es zu erleichtern wäre die Funktion ja ganz praktisch mit dem String wo er dann nur bestimmmte Zeichen anninmmt. Für mich wären hier Praktisch die Zahlen das - das _ Zeichen und dasn gute Alphabeth sowie leer Zeichen. Nur leider habe ich die Funktion nicht ganz verstanden wurde hier in 2 Beiträgen unter/über mir geschrieben...

    naja

    schöne Grüße und ich hoffe auf Antwort =)

    2 Mal editiert, zuletzt von Bloodykill (9. Januar 2010 um 14:14)

  • Der Server soll ja später relativ im Hintergrund laufen und da ist die Sekunde mir persöhnlich dann egal...:)

    Mein Problem ist ja dass der Server mit den ips nicht läuft:
    _Getip()
    xxx . dyndns .org (Lehrzeichen weger inetadresse)
    TCPnametoip("xxx. dyndns .org") //denke aber du hasst damit den Clienten gemeint xD
    die Adresse von WieistmeineIP .de
    und bei ipconfig/all die beiden Einträge unter DNS Server.
    Oder muss ich beim Server einfach 127.0.0.1 eingeben und beim Clienten die Verbindung von Tcpnametoip?

    ~.~help~.~

  • beim server machste einfach @ipaddress1 .. beim clienten dann mittels TCPNameToIp die Ip addresse..allerdings musste in deinem Router den Port an dienen PC weiterleiten, sonst kanns nicht funktionieren

  • beim server machste einfach @ipaddress1 .. beim clienten dann mittels TCPNameToIp die Ip addresse..allerdings musste in deinem Router den Port an dienen PC weiterleiten, sonst kanns nicht funktionieren

    Port wird schon weitergeleitet und bei @ipaddress1 kann Freund immernochnicht connecten...

  • ist @ipaddress1 die ip-adresse mit der du auch mit deinem Router verbunden bist??

    dachte ich^^

    mir ist grade ne Kleinigkeit aufgefallen :)
    hab Früher bei Hapacke Server schon Ports für den PC vreigeschalten das ging über die IP 192.168.0.101 aber beim Server kommt dass es 192.168.0.102 wurde anscheinend geändert und deshalb wurden die Ports vllt falsch weitergeleitet^^ xD

    ich prob glei mal mit Freund des nomal aus obs jetzt geht ;D

    • Offizieller Beitrag

    Also, nochmal ganz langsam zum mitschreiben:

    - Serverprogramm horcht (TCPListen) auf die lokale IP (@IPAdress1) des Serverrechners.

    - Im Router des Serverrechners muss eine Portweiterleitung (Port: 21219) existieren auf die lokale IP des Serverrechners.

    - Wenn Du DynDNS für den Server benutzt, muss Du die WAN-IP (_GetIP) vom Serverrechner an DynDNS übermitteln (entweder per Router, wenn der das anbietet oder ein Programm auf dem Serverrechner).

    - Das Clientprogramm ermittelt die IP-Adresse des Servers per:

    [autoit]

    $IP = TCPNameToIP("name.dyndns.org")

    [/autoit]

    - Danach kann sich der Client mit TCPConnect($IP, $Port) mit dem Server verbinden.

  • Hmm war mir nun bis jetzt eine Große Hilfe ^^ jetzt noch paar fragen und n kleiner Fehler den ich nicht finden kann ^^

    Also hier nochmal der Client:

    Spoiler anzeigen
    [autoit]

    $abcdefghi=0
    $regi=GUICreate("Registration pls!",200,90)
    $InID=GUICtrlCreateInput("",1,1,199,19)
    $InPW=GUICtrlCreateInput("",1,20,199,19,$ES_PASSWORD)
    $But1=GUICtrlCreateButton("Login",1,40,199,49)
    GUISetState()
    $logggein=0
    While $abcdefghi=0
    $msg=GUIGetMsg()
    If $msg = -3 then Exit
    If $msg = $But1 then
    $deinpasswort=GUICtrlRead($InPW)
    $deineid=GUICtrlRead($InID)
    If $deinpasswort="" or $deineid="" Then
    MsgBox(0,"","Sry da Fehlt was...",5)
    Exit
    EndIf
    GUIDelete($regi)
    $IDServer1=TCPConnect("127.0.0.1",12341)
    $PWServer1=TCPConnect("127.0.0.1",12340)
    $IDServer2=TCPListen("127.0.0.1",54321)
    $PWServer2=TCPListen("127.0.0.1",54320)
    If $IDServer1=-1 or $PWServer1=-1 then
    MsgBox(20,"Can´t Connect to the Server","The Window will close in 5 sec.",5)
    Exit
    EndIf
    Sleep(1000)
    $deinpasswort=GUICtrlRead($InPW)
    $deineid=GUICtrlRead($InID)
    TCPSend($IDServer1,$deineid)
    TCPSend($PWServer1,$deinpasswort)
    While $abcdefghi=0
    $iIDServer=TCPAccept($IDServer2)
    $pwServer=TCPAccept($PWServer2)
    $Serverpasswort=TCPRecv($PWServer2,25)
    $ServerID=TCPRecv($IDServer2,25)
    If $Serverpasswort ="wrong" or $ServerID="wrong" Then
    MsgBox(20,"ID or Passwort wrong","It´ll be Exit in 5 sec.",5)
    Exit
    EndIf
    If $Serverpasswort=$deinpasswort and $deineid=$Serverid then
    $abcdefghi=1
    EndIf
    WEnd
    EndIf
    WEnd
    HotKeySet("{ENTER}","_enter")
    $GUI=GUICreate("7by7 Server Check v. 1.0 betha",400,500)
    $Edit=GUICtrlCreateedit("",1,1,399,399)
    $Input=GUICtrlCreateInput("",1,400,399,99)
    GUISetState()
    While 1
    If GUIGetMsg()= -3 then Exit
    Sleep(1000)
    WEnd
    #EndRegion

    [/autoit]

    Mein ID Server:

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $nr=1
    $PW=TCPListen("127.0.0.1",12341)
    While 1
    $acc=TCPAccept($PW)
    If $acc <> -1 Then
    $idClient=TCPConnect("127.0.0.1",54321)
    While 1
    $Recv=TCPRecv($PW,20)
    If $recv<>"" and $recv<>-1 Then
    While 1
    $x=IniRead("Config.ini","ID",$nr,"iojklmnoolkokajdnljehud")
    If $x="iojklmnoolkokajdnljehud" then TCPSend($idClient,"wrong")
    if $recv=$x Then
    TCPSend($pwClient,$x)
    $recv= -1
    ExitLoop
    EndIf
    $nr=$nr+1
    WEnd
    EndIf
    WEnd
    EndIf
    WEnd

    [/autoit]


    und mein PW Server:

    [autoit][/autoit]
    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $nr=1
    $PW=TCPListen("127.0.0.1",12340)
    While 1
    $acc=TCPAccept($PW)
    If $acc <> -1 Then
    $pwClient=TCPConnect("127.0.0.1",54320)
    While 1
    $Recv=TCPRecv($PW,20)
    If $recv<>"" and $recv<>-1 Then
    While 1
    $x=IniRead("Config.ini","PW",$nr,"iojklmnoolkokajdnljehud")
    If $x="iojklmnoolkokajdnljehud" then TCPSend($pwClient,"wrong")
    if $recv=$x Then
    TCPSend($pwClient,$x)
    $recv= -1
    ExitLoop
    EndIf
    $nr=$nr+1
    WEnd
    EndIf
    WEnd
    EndIf
    WEnd

    [/autoit]
    [autoit][/autoit]

    Soo...

    Wenn ich beim Client keine ip/pw eingebe-->meine Fehlermeldung des passt shconmal.
    Wenn der Client nicht zum einen der Server am Anfang connecten kann kommt ebenfalls meine Fehlermeldung also passt auch =)
    nunaber der Client Geht einfach direkt zum 2.gui egal bei welchem paswwort. habe mal Msgbox(0,$Serverpasswort,$Serverid) gemacht also es kommt ne Leere msgbox...

    und gibt es eine Funktion die automatisch die ports vom Router an den pc leitet(mit Glück in autoit ist alles möglisch =)) und vllt eine noch die die DyndnsAdresse von einem ausließt bzw. seine IP die durch dyndns überdeckt wurde?

    danke schonmal =D

  • Des erste prob konnte ich noch lösen...

    Nunja..
    es dauert bei mir jetzt leider etwas bis es auf den Klick vom Buttom antwortet(ca 30 sekunden^^)

    Spoiler anzeigen
    [autoit]

    #Region Func´s etc.
    TCPStartup()
    Func _ichhoffegeht()
    EndFunc
    #include <GUIConstants.au3>
    #include <Inet.au3>
    #include <EditConstants.au3>
    #EndRegion
    #Region Haupt
    $erwartelogin=0
    $regi=GUICreate("Registration pls!",200,90)
    $InID=GUICtrlCreateInput("",1,1,199,19)
    $InPW=GUICtrlCreateInput("",1,20,199,19,$ES_PASSWORD)
    $But1=GUICtrlCreateButton("Login",1,40,199,49)
    GUISetState()
    $logggein=0
    While $erwartelogin=0

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

    Sleep(1000)
    $msg=GUIGetMsg()
    If $msg = -3 then Exit
    If $msg = $But1 then
    MsgBox(0,"","")
    $IDServer1=TCPConnect("127.0.0.1",12341)
    $PWServer1=TCPConnect("127.0.0.1",12340)
    $IDServer2=TCPListen("127.0.0.1",54321)
    $PWServer2=TCPListen("127.0.0.1",54320)
    $iIDServer=TCPAccept($IDServer2)
    $pwServer=TCPAccept($PWServer2)
    $deinpasswort=GUICtrlRead($InPW)
    $deineid=GUICtrlRead($InID)
    If $deinpasswort="" or $deineid="" Then
    MsgBox(0,"","Sry da Fehlt was...",5)
    Exit
    endIf
    TCPSend($IDServer1,$deineid)
    TCPSend($PWServer1,$deinpasswort)
    If $IDServer1=-1 or $PWServer1=-1 then
    MsgBox(20,"Can´t Connect to the Server","The Window will close in 5 sec.",5)
    Exit
    EndIf
    GUIDelete($regi);;#####Richtiges abwarten auf antwort
    While 1
    $Serverpasswort=TCPRecv($PWServer2,25)
    $ServerID=TCPRecv($IDServer2,25)
    If $Serverpasswort ="wrong" or $ServerID="wrong" Then
    MsgBox(20,"ID or Passwort wrong","It´ll be Exit in 5 sec.",5)
    Exit
    EndIf
    If $Serverpasswort=$deinpasswort and $deineid=$Serverid then
    $erwartelogin=1
    ExitLoop
    EndIf
    MsgBox(0,$Serverpasswort,$ServerID)
    WEnd
    EndIf
    WEnd
    MsgBox(0,$Serverpasswort,$ServerID)
    $GUI=GUICreate("7by7 Server Check v. 1.0 betha",400,500)
    $Edit=GUICtrlCreateedit("",1,1,399,399)
    $Input=GUICtrlCreateInput("",1,400,399,99)
    GUISetState()
    While 1
    If GUIGetMsg()= -3 then Exit
    Sleep(1000)
    WEnd
    #EndRegion

    [/autoit]


    id

    Spoiler anzeigen
    [autoit]

    TCPStartup()

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

    $PW=TCPListen("127.0.0.1",12341)
    While 1
    $acc=TCPAccept($PW)
    If $acc <> -1 Then
    $idClient=TCPConnect("127.0.0.1",54321)
    While 1
    $Recv="blabla";TCPRecv($PW,20)
    If $recv<>"" and $recv<>-1 Then
    While 1
    TCPSend($idClient,$recv)
    WEnd
    EndIf
    WEnd
    EndIf
    WEnd

    [/autoit]


    pwserver:

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $PW=TCPListen("127.0.0.1",12340)
    While 1
    $acc=TCPAccept($PW)
    If $acc <> -1 Then
    $pwClient=TCPConnect("127.0.0.1",54320)
    While 1
    $Recv=TCPRecv($PW,20)
    If $recv<>"" and $recv<>-1 Then
    While 1
    TCPSend($pwClient,$recv)
    WEnd
    EndIf
    WEnd
    EndIf
    WEnd

    [/autoit]

    wenn ichs meiner Meinung nach richtig habe sollte der Client erstmals immer ein richtiges PW gesendet bekommen...

    ich hoffe ihr könnt mir helfen xD jedenfalls wenn man eine Msgbox einfügt mit Msgbox(0,$Serverpasswort,$Serverid) kommt eine leere Msgbox... weis wer weiter *-*

    naja.. *edit* und *hochschieb*