TCP

  • So ich habe mal wieder eine frage :) :
    Habe vorkurzem mit etwas mit TCP beschäftigt und habe ein Chat für 2 Leute gemacht ,was auch super funktioniert hat . Nun will ich das aber ausweiten und ein Chat machen der Sachen an einen Server schickt und der Server an alle zurzeit aktiven Clients weiterleitet. So alles schon und gut aber wie kann ich mehrere TCP Verbindungen haben und an diese dann die Sachen schicken ? Wenn das überhaupt möglich ist. Und wie kann ich herausfinden welche Clients gerade noch aktiv sind ?

    Hier mal der Ansatz für den Server [Client weiß ich wie das geht :)] :

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $MainSocket=TCPListen(@IPAddress1,12319)
    $Acc = -1
    Do
    $Acc=TCPAccept($MainSocket)
    Until $Acc <> -1

    [/autoit]


    aber da habe ich nur verbindung zu einem Client oder ? :) Bitte um Hilfe ...
    mfg nof@ker

    3 Mal editiert, zuletzt von nof@ker2 (20. April 2009 um 19:24)

  • Für mehrere Verbindungen, also beim Server, kannst du
    einfach im Main-Loop weitere Verbindungen annehmen und die
    Sockets in einer Array speichern.
    Was du sowieso machen musst, ist, ebenfalls im Main-Loop, alle Sockets, alle
    angenommenen Verbindungen, auf eingehende Nachrichten zu überprüfen, bzw.
    Nachrichten in Empfang zu nehmen:
    Mit TCPRecv.
    Wird vom Clienten nichts gesendet wird der Versuch nach X Millisec abgebrochen,
    kannst du mit Opt( .. ) einstellen. Wenn der Client die Verbindung getrennt hat wird
    dazu noch ein @error auftreten, den kannst du abfragen und den entsprechenden
    Eintrag aus deiner Array löschen. =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Versuch das doch einfach Schritt für Schritt
    selber umzusetzen, ich versteh nicht, warum immer
    alle für alles ein Beispiel haben wollen...

    Ich bin der Ansicht, dass meine Beschreibung detailliert genug war. ;)
    Ansonsten gibt es hier noch andere Threads mit fertigen Chats oder Ansätzen dazu...

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • so habs hinbekommen : hier nochmal für alle das script vom server :

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    TCPStartup()
    $MainSocket=TCPListen(@IpAddress1,28960)
    Dim $Acc[1]
    $Acc[0]=""
    $AccAdd=-1
    Do
    $AccAdd=TCPAccept($MainSocket)
    Until $AccAdd <> -1
    _ArrayAdd($Acc,$AccAdd)
    _ArrayDelete($Acc,0)
    AdLibEnable("_Send",300000)
    While 1
    For $i=0 to Ubound($Acc,1)-1
    If $Acc[$i] = @error Then
    _ArrayDelete($Acc,$i)
    EndIf
    Next
    $Accept=TCPAccept($MainSocket)
    If $Accept <> -1 Then
    _ArrayAdd($Acc,$Accept)
    EndIf
    For $i=1 to Ubound($Acc,1)-1
    $Recv=TCPRecv($Acc[$i],999999)
    If $Recv <> "" Then
    For $j=0 to $i-1
    TCPSend($Acc[$j],$Recv)
    Next
    For $j=$i+1 to Ubound($Acc,1)-1
    TCPSend($Acc[$j],$Recv)
    Next
    EndIf
    Next
    WEnd
    Func _Send()
    For $i=0 to Ubound($Acc,1)-1
    TCPSend($Acc[$i],"ADMIN**"&"ADMIN ist online bitte pass auf was du sagst.")
    Next
    EndFunc

    [/autoit]
  • [autoit]

    For $i=0 to Ubound($Acc,1)-1
    If $Acc[$i] = @error Then
    _ArrayDelete($Acc,$i)
    EndIf
    Next

    [/autoit]

    Fehler !
    Warum sollte $Acc[$i] aufeinmal = @error sein ?

    Die Aussonderung der verlorenen Clienten muss nach dem
    TCPRecv geschehen:

    [autoit]


    $Recv = TCPRecv( $Acc[$i], 2048 )
    If @error Then
    _ArrayDelete( $Acc, $i )
    ContinueLoop
    EndIf

    [/autoit]


    ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • das geht aufjedenfall über weitreichende gebiete aber ich bin mir nicht sicher ob mit @IPAddress1 oder mit _GetIP mit welcher IP der Client connecten soll :D

  • ich weiß ich nicht aber bei mir stimmt das ... :) und es geht auch :D

    Das kann so nicht gehen.
    Du prüfst, ob der Wert von $Acc[$i] gleich ist mit dem aktuellen Wert des @error-Makros !
    Zuvor hast du aber $Acc[$i] als die Socket-Nummer des neuen Clienten definiert, und
    $Acc[$i] wird auch an keiner anderen Stelle ein neuer Wert zugewiesen !

    Was du tun musst ist, wie zuvor beschrieben, prüfen, ob beim Empfangen von Daten mit
    TCPRecv ein Fehler auftritt !! :pinch:


    Edit: Über "weitreichende Gebiete":
    Server IP in TCPListen muss Lokale IP sein.
    Im Router des Netzwerkes des Servers muss der genutzte Port auf die Lokale IP weitergeleitet werden.
    Der Client muss die Globale IP des Server im TCPConnect angeben.
    Wie auch in X Threads zuvor erklärt...

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Zitat

    Edit: Über "weitreichende Gebiete":
    Server IP in TCPListen muss Lokale IP sein.
    Im Router des Netzwerkes des Servers muss der genutzte Port auf die Lokale IP weitergeleitet werden.
    Der Client muss die Globale IP des Server im TCPConnect angeben.
    Wie auch in X Threads zuvor erklärt...

    Sorry, aber das heist wenn ich den Server spiele in meinem Netzwerk und jemand anders in einem anderen Netzwerk der client ist, muss beim Clienten die IP meines Routers oder meine Server IP angegeben werden?

  • Es geht doch gerade darum, wie das im Internet läuft ?

    Der Client muss die WAN-Ip des Servers angeben.

    -- Zu langsam. ^^ Portweiterleitung hatte ich im übrigen schon erwähnt ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • weniger ... du musst entweder port freigeben oder wenn an deinem router port forwarding eingestellt ist brauchst du das nicht machn :D :P :)
    mfg nof@ker

  • Im Router halt.
    Virtual Server, oder Special Applications, oder vielleicht heißt es bei dir "Port-Forwarding" ?

    Klar hat das Auswirkungen:
    Alle Anfragen, Verbindungsversuche, die von außen über den einen Port kommen werden auf
    den Server-PC weitergeleitet.
    Kann u.U. Probleme mit anderen Programmen geben,
    zum Thema Sicherheitslücke kann ich nichts zu sagen, hab ich nicht viel Ahnung von.

    Edit:
    @nof@ker : Hast du meinen Einwand inzwischen verstanden ?

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • ok es gibt doch unerwartete schwierigkeiten :( ...

    Spoiler anzeigen
    [autoit]

    include <Array.au3>
    TCPStartup()
    $MainSocket=TCPListen(@IpAddress1,28960)
    Dim $Acc[1]
    $Acc[0]=""
    $AccAdd=-1
    Do
    $AccAdd=TCPAccept($MainSocket)
    Until $AccAdd <> -1
    _ArrayAdd($Acc,$AccAdd)
    _ArrayDelete($Acc,0)
    AdLibEnable("_Send",300000)
    While 1
    $Accept=TCPAccept($MainSocket)
    If $Accept <> -1 Then
    _ArrayAdd($Acc,$Accept)
    EndIf
    For $i=1 to Ubound($Acc,1)-1
    $Recv=TCPRecv($Acc[$i],999999)
    If @error Then
    _ArrayDelete($Acc,$i)
    ContinueLoop
    Else
    MsgBox(0,"sucess","success")
    EndIf
    If $Recv <> "" Then
    FileWrite(@ScriptDir&"\Verlauf.ini",@CRLF&$Recv)
    For $j=0 to $i-1
    TCPSend($Acc[$j],$Recv)
    Next
    For $j=$i+1 to Ubound($Acc,1)-1
    TCPSend($Acc[$j],$Recv)
    Next
    EndIf
    Next
    WEnd
    Func _Send()
    For $i=0 to Ubound($Acc,1)-1
    TCPSend($Acc[$i],"ADMIN**"&"Bitte benehmt euch im Chat . Der Ablauf wird abgespeichert.")
    Next
    EndFunc

    [/autoit]


    Das ist der Code :D und wenn er Dateien empfangen wurde oder Nachrichten müsste ja eigentlich eine MsgBox mit success kommen . Kommt aber nicht stattdessen gibt $Recv jedesmal ein error aus :( Problem : Zeile 18-35

  • [autoit]

    $Recv=TCPRecv($Acc[$i],999999)

    [/autoit]

    Ob 999999 in der Funktion aktzeptiert wird ?
    Mal mit kleineren Werten, wie 2048, versucht ?

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • sorry aber es geht immernochnicht habe es mit 2048 versucht aber geht nicht das wird schon aktzeptiert ... aber ich glaub der fehler liegt irgendwo mit der schleife oder dem recv ich verzweifle gleich :( :( bitte helft mir
    mfg nof@ker