TCP Verbindung

  • also ich brauche jetz keine anleitung wie ich ne portfreigabe erstelle
    aber ich komme immer durcheinander bei tcp mit server client
    was ist da jetzt genau der Server und client (also merkmale)

    und die Portfreigabe, muss die dann beim Server oder Client laufen?

    /Edit

    Spoiler anzeigen
    [autoit]

    #include<Inet.au3>

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

    $adresse = @IPAddress1
    $port = 38989
    TCPStartup ()
    while 1
    sleep (200)
    $socket = TCPConnect ($adresse, $port)
    if $socket = -1 Then ContinueLoop
    TCPSend ($socket, "§IP=§"&_GetIP()&"§USERNAME=§"&@UserName)
    if @error Then ContinueLoop
    while 1
    $anweisung = TCPRecv ($socket, 1024)
    if @error then ContinueLoop 2
    if $anweisung = "" then ContinueLoop
    Switch $anweisung
    Case "connection"
    TCPSend ($socket, "§USERNAME=§"&@UserName()&"§COMPUTERNAME=§"&@ComputerName&"§WANIP=§" & _GetIP()&"§PING=§"&Ping("www.google.de")&"§LOCALIP=§"&@IPAddress1&"§OSSYSTEM=§"&@OSVersion)
    EndSwitch

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

    WEnd
    WEnd

    [/autoit]


    wäre das nun server oder client? und müsste ich jetz da die Portfreigabe machen oder in meinem anderen skript?

    Einmal editiert, zuletzt von Reaker (5. November 2009 um 16:16)

  • also immer da wo du "horchst", also auf daten wartest, dass ist der server

    wenn man das so sieht, dann ist aber auch ein browser ein server, denn der wartet ja auch auf eine seite, wenn man z.B. auf einen link klickt.

  • also ich habe hier mal mein skript eben vereinfacht...

    das läuft auf meinem Rechner:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <ListViewConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <GuiEdit.au3>
    #include <ScrollBarConstants.au3>
    #include <FTP.au3>
    #Include <GuiListView.au3>
    $Port = 38989
    Dim $connections [999]
    Dim $mainsocket = -1
    Global $Form1_1 = GUICreate("Client Verwaltung", 600, 230, 146, 16)
    GUISetBkColor(0xB4B4B4)

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

    ;###CLIENT WÄHLEN

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

    Global $Group1 = GUICtrlCreateGroup("Client wählen", 9, 6, 229, 214)
    Global $ListView1 = GUICtrlCreateListView("WAN-IP|Username", 18, 24, 211, 148, BitOR($LVS_REPORT,$LVS_SINGLESEL,$LVS_SHOWSELALWAYS,$WS_HSCROLL,$WS_VSCROLL))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 120)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 80)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Button1 = GUICtrlCreateButton("Suchen", 18, 180, 64, 25, $WS_GROUP)
    Global $Button2 = GUICtrlCreateButton("Verbinden", 87, 180, 70, 25, $WS_GROUP)
    Global $Button3 = GUICtrlCreateButton("Trennen", 162, 180, 64, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    ;###CLIENT-INFO SHORT

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

    Global $Group2 = GUICtrlCreateGroup("Client-Info Short", 249, 6, 346, 214)
    Global $Label1 = GUICtrlCreateLabel("Username", 258, 27, 52, 17)
    Global $Label2 = GUICtrlCreateLabel("Computername", 258, 54, 75, 17)
    Global $Label3 = GUICtrlCreateLabel("IP-Adresse", 258, 81, 55, 17)
    Global $Label4 = GUICtrlCreateLabel("Ping", 258, 108, 25, 17)
    Global $Label5 = GUICtrlCreateLabel("Local IP", 258, 135, 43, 17)
    Global $Label6 = GUICtrlCreateLabel("OS-System", 258, 159, 56, 17)
    Global $Input1 = GUICtrlCreateInput("", 354, 24, 202, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Input2 = GUICtrlCreateInput("", 354, 51, 202, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Input3 = GUICtrlCreateInput("", 354, 78, 202, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Input4 = GUICtrlCreateInput("", 354, 105, 202, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Input5 = GUICtrlCreateInput("", 354, 132, 202, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Input6 = GUICtrlCreateInput("", 354, 159, 202, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    Global $Button4 = GUICtrlCreateButton("Aktualisieren", 504, 192, 79, 22, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1;//Verbindung suchen
    TCPStartup ()
    $mainsocket = TCPListen (@IPAddress1, $Port, 999)
    if $Mainsocket = -1 Then
    TCPShutdown ()
    $Mainsocket = - 1
    ContinueLoop
    EndIf
    for $k = 0 to UBound ($connections) - 1
    $connections[$k] = ""
    Next
    Case $Button2;//Verbinden
    If _GUICtrlListView_GetItemTextString($ListView1) = "" Then
    Else
    MsgBox(0, "", "Verbunden")
    EndIf
    Case $Button3;//Trennen
    TCPShutdown ()
    $Mainsocket = - 1
    EndSwitch

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

    $tempconnection = TCPAccept ($mainsocket)
    if $tempconnection = - 1 then ContinueLoop

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

    $index = _ArraySearch ($connections, $tempconnection)
    if @error Then
    for $j = 0 to UBound ($connections) - 1
    if $connections[$j] = "" then
    $connections[$j] = $tempconnection
    $string = TCPRecv ($connections[$j], 2048)
    if $string = "" then ContinueLoop
    $split = StringSplit($string, "§")
    GUICtrlCreateListViewItem($split[3]&"|"&$split[5], $listview1)
    ExitLoop
    EndIf
    Next
    EndIf

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

    WEnd

    [/autoit]

    das hier auf dem anderen seinen:

    Spoiler anzeigen
    [autoit]

    #include<Inet.au3>

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

    $adresse = @IPAddress1
    $port = 38989
    TCPStartup ()
    while 1
    sleep (200)
    $socket = TCPConnect ($adresse, $port)
    if $socket = -1 Then ContinueLoop
    TCPSend ($socket, "§IP=§"&_GetIP()&"§USERNAME=§"&@UserName)
    if @error Then ContinueLoop
    while 1
    $anweisung = TCPRecv ($socket, 1024)
    if @error then ContinueLoop 2
    if $anweisung = "" then ContinueLoop
    Switch $anweisung
    Case "connection"
    TCPSend ($socket, "§USERNAME=§"&@UserName()&"§COMPUTERNAME=§"&@ComputerName&"§WANIP=§" & _GetIP()&"§PING=§"&Ping("www.google.de")&"§LOCALIP=§"&@IPAddress1&"§OSSYSTEM=§"&@OSVersion)
    EndSwitch

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

    WEnd
    WEnd

    [/autoit]

    das mit dem suchen und so funktioniert soweit auch ganz gut...nur wie soll ich das mit dem verbinden machen??
    also ich müsste jetz den Befehl connections an einen bestimmten senden welcher mir dann os ping computername, etc. mitteilt

    dann kommt auch noch das Problem mit der Portfreigabe, wenn ich das ja so mache müsste ich ja eine portfreigabe auf dem anderen pc haben, bloß da habe ich ja keinen zugriff auf seinen router ?( ?(

  • sry für push aber kann denn keiner helfen?

    ich verfluche langsam dieses misst TCP, zumindestens weil ich das niicht blicke

  • Hi,
    gaaaaaannnnnzzz ruuuuhhhhiiiiggggg^^

    Zunächst einmal solltest du dir überlegen, was du machen möchtest. Hört sich jetzt vielleicht bescheuert an, aber genau daran hapert es m.E. bei dir!
    Nimm 2 Blätter Papier (ja, dazu braucht man keinen Computer^^) und schreib auf das eine SERVER und auf das andere CLIENT.
    Jetzt hast du dein Problem schon in 2 Einzelteile zerlegt, also ist jedes nur noch halb so schlimm^^

    Der SERVER ist ein Programm, welches auf eine Verbindung wartet, schreib das auf das Blatt Papier.
    Ok, was braucht man für eine (einfache) TCP-Verbindung? IP-Adresse, und Portnummer....AUFSCHREIBEN (untereinander)!

    Wo bekommt der Server seine IP-Adresse her? Na die hat er schon, das ist die IP-Adresse der Netzwerkkarte mit der er verbunden ist. In AutoIt z.B. mit @IPAddress1 zu bekommen. Aufschreiben !(hinter IP-Adresse)

    Wo bekommt der Server seinen Port her? Der Server ist der Meister aller Klassen, gewissermassen der King und als KING fragt man nicht, man LEGT FEST! Einige Ports sind schon belegt, aber andere (>50000) sind nicht belegt, da wählt man einfach einen aus z.b. 55438
    (Aufschreiben hinter "Port"....aber das kennst du ja nun....)

    Weiter gehts. Damit überhaupt irgendetwas mit TCP gemacht werden kann, muss man das vorbereiten mittels TCPStartup() (aufschreiben....das spare ich mir ab jetzt, wenn zum Schluss dein Script nicht läuft, dann liegts daran!)

    Der SERVER "hört" (na, wie heisst "hören" auf englisch?) auf auf einem Anschluss (Socket), und diesen Anschluss erstellt man mit $Socket=TCPlisten().

    So, jetzt kommts! Der Server ist wie gesagt der KING und es bekommt nur der eine Audienz beim KINg, der auch AKZEPTIERT wird (wie heisst akzeptieren auf englisch??). Na also, der King "hört" nun SO LANGE, bis er einen ihm genehmen Teilnehmer AKZEPTIERT! Weil der King etwas vergesslich ist, schreibt er sich die KENNUNG dieser akzeptierten Verbindung auf....
    $connectedsocket=TCPaccept()....(solange warten, bis kein Fehler (-1) mehr auftritt)

    Damit jeder im Königreich auch weiss, dass der KING eine Verbindung aufgebaut hat, jagt der King seinen Herold durchs Land und der bringt diese NACHRICHT in jeden BRIEFKASTEN des Landes....(Kombiniere mal die englischen Wörter von Nachricht und Briefkasten (Kurzwort).... :rofl: )

    Der King ist sehr geduldig mit seinen Untertanen, er sitzt auf seinem Thron und wartet ...und wartet....und wartet...ENDLOS...darauf einen Untertanen mit einer bestimmten Kennung zu EMPFANGEN (wie heisst das Wort auf englisch?) (aufschreiben!) ....TCPRecv()

    Irgendwann fasst sich der verbundene Untertan ein Herz und spricht den KING schüchtern über die Verbindung an! HA! Jetzt wird der King munter, er EMPFÄNGT (wie heisst das Wort auf englisch?) die Nachricht des Untertanen. JUHUUUUU! Endlich erfährt der KING die neuesten Neuigkeiten aus seinem Königreich und schreibt sie auf!!! $empfang=TCPRecv()

    Damit auch jeder im Königreich erfährt, was es neues gibt, schickt der KINg den Herold.....und ....(das war die Sache mit der Messagebox....)

    Der Untertan freut sich über die gute Laune des Kings und möchte nun neue Nachrichten erzählen, ihm fallen aber keine ein, also rennt er schnell weg und sucht neuen Klatsch und Tratsch aus dem Königreich....

    Währendessen bleibt dem KING nichts weiter übrig, als auf die Nachrichten des Untertanen zu warten....und zu warten.... und zu warten, also setzt er sich auf seinen Thron ......(das hatten wir doch schon mal?!)


    Soweit die Geschichte vom KING.....öhm...bei den EDV´lern ist das der "SERVER" also solltest du die Geschichte 1:1 in die EDV-Sprache umsetzen können! Versuchs mal!!!!
    SERVER:

    Spoiler anzeigen
    [autoit]

    ;Serverprozess auf dem Empfangsrechner starten

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

    $IP_adresse=@IPAddress1
    $Port=33891

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

    TCPStartup()

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

    $Socket = TCPListen($IP_adresse, $port, 100)

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

    do ;solange warten, bis ein Client eine Verbindung aufbaut
    $ConnectedSocket = TCPAccept($Socket)
    ToolTip("Server empfangsbereit...")
    until $ConnectedSocket <> -1 ;wenn Verbindung akzeptiert, dann weitermachen

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

    MsgBox(0, "TCP-Server", "Server hat Verbindung zum Client aufgebaut", 1)

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

    While 1 ;der KING hat endlos Zeit.......
    Do ;warten auf die Nachricht vom Client
    $recv = TCPRecv($ConnectedSocket, 2048) ;nachricht empfangen
    Sleep(10) ;Prozessor entlasten^^
    Until $recv <> "" ;...solange warten, bis eine Nachricht eingetroffen ist

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

    MsgBox(0, "Server hat empfangen:", $recv, 2)
    WEnd

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

    TCPShutdown()

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


    .....oha...du hast ja noch ein zweites Blatt Papier........

    • Offizieller Beitrag

    Du bist ein Super Märchenonkel Andy :D

  • Was macht denn der Untertan im Königreich wenn er bei dem KING eine Audienz haben möchte?

    Zuerst notiert er sich die Adresse des KINGS (!!!!!!!!!!!!!!!!!!!!!!!!!) und die Portnummer.....

    Um überhaupt mit dem KING zu kommunizieren, benötigt man ..........TCPStartup()

    Der Untertan braucht einen Anschluß(Socket) zum KING
    Nun möchte sich der Untertan mit dem König VERBINDEN ( na, wie heisst das auf englisch?).... Er bekommt diesen Anschluß von ...........TCPConnect()

    Der King hat die Verbindung akzeptiert, der Herold gibt das bekannt!....(Messagebox vom King!)

    Der Untertan möchte dem KING einiges erzählen, er ist aber so erfürchtig, dass er vor jeder Nachricht in Ohnmacht fällt (ca 2,5-3 Sekunden ^^ so lange, bis der Herold die Nachricht an alle verteilt hat (Dauer der Msgbog beim Server))

    Nun schreibt der Untertan einen TEXT, den er dem KING schicken möchte (na wo kommt der Text her....aus einer INPUTBOX!)

    ...und SENDET (TCPsend() ) diesen Text an die Verbindung (Socket)....also TCPSend($socket,$text)

    Der King empfängt die Nachricht und schickt den Herold ins Land.....der Untertan ist vor Erfurcht Ohnmächtig geworden und sendet, als er wieder erwacht, die nächste Nachricht......


    Das macht der Untertan! SONST NICHTS! Wenn du die wichtigsten Stichpunkte aufgeschrieben hast, dann kannst du das Script des Untertanen(CLIENT) schreiben......VERSUCHS!
    CLIENT:

    Spoiler anzeigen
    [autoit]

    $Empfaenger_IP = @IPAddress1 ;IP-Adresse des Servers!
    $Port = 33891 ;PORT, auf dem der Server lauscht!

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

    TCPStartup()

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

    $Socket = TCPConnect($Empfaenger_IP, $Port)
    While 1
    Sleep(2500)
    $text = InputBox("Client", "Bitte Nachricht an den Server eingeben:")
    If $text = "" Or @error Then ExitLoop
    TCPSend($Socket, $text)
    WEnd

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

    TCPShutdown()

    [/autoit]

    /*EDIT*/ Du kannst testweise den Client und den Server auf einem Rechner laufen lassen! Also erst das SERVER-Script kompilieren und starten (ggf meckert hier schon die Firewall, also erlauben!), danach das CLIENT-Script starten (z.B. direkt aus Scite). Wenn die Firewall wieder meckert, auch diese Verbindung erlauben!

    Wenn du eine etwas bessere Lösung (ggf incl. Protokoll) suchst, dann schau mal HIER. Anhand der Kommentare in den Scripten sollte klar werden, warum der Client erst nach Freigabe durch den Server sendet uvm....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (5. November 2009 um 23:52)

  • Zitat

    Du bist ein Super Märchenonkel Andy

    Wenns anders nicht geht, dann eben so :rock:

  • danke erstmal für eure tollen Märchen, ist somit leicht zu verstehen

    aber wie funktioniert dass mit diesen Verbindung suchen?

  • Zitat

    aber wie funktioniert dass mit diesen Verbindung suchen?


    Sorry aber ich verstehe die Frage nicht! Niemand "sucht" eine Verbindung. Der Server wartet auf eine Verbindung und der Client baut eine Verbindung zum Server auf.....wer soll denn was wo warum suchen?