tcpconnect dauert zu lange

  • Wenn man eine Art Serversuchfunktion macht, und tcpconnect in einer while schlfleife versuchen lsst verschiedene ip's zu connecten, geht das immer so lang wenn kein server auf der ip und dem port existiert.
    Kann man das irgendwie mindern ? Also timeout dauer senken ? Mit opt("TCPTimeout") geht das nich ....


    Hoffe auf schnelle Antwort

    Hier der Source Code für die "Suche":

    Spoiler anzeigen
    [autoit]


    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiIpAddress.au3>

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

    func join()
    GUIDelete()
    GUIDelete()

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

    $Form1_1 = GUICreate("Spiel beitreten", 370, 249, 340, 151)
    $Label1 = GUICtrlCreateLabel("Server- IP:", 16, 24, 54, 17)
    $Button1 = GUICtrlCreateButton("Verbinden", 224, 24, 75, 25, $WS_GROUP)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1_1, 80, 24, 130, 21)
    _GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
    $ListView1 = GUICtrlCreateListView("Name|Server- IP", 16, 64, 306, 150)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150)
    $Label2 = GUICtrlCreateLabel("Suche Server:192.168.1.1", 16, 224, 340, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    $ip4=1
    $ip3=1
    $anz=0
    dim $item[99]
    for $i=0 to 98
    $item[$i]=-1
    next
    dim $done[256]
    $local=0
    While 1
    $ip4+=1
    if $ip4>255 Then
    $ip4=1
    ;~ $ip3+=1
    ;~ if $ip3>255 then $ip3=1
    ;=================================> Search for more Lan- IP's (192.168.XXX.XXX(without this option 192.168.1.XXX)) . Slows the Server- Search
    ;~ $socket=TCPConnect(@IPAddress1,27000)
    ;~ if $socket<>-1 Then
    ;~ $rec=TCPRecv($socket,100)
    ;~ if $local<> 1 then
    ;~ $item[$anz]=GUICtrlCreateListViewItem($rec&"|"&"127.0.0.1",$ListView1)
    ;~ $anz+=1
    ;~ $local=1
    ;~ EndIf
    ;~ EndIf
    ;=================================> localhost Serverhosting. Might slow or crash the Server- Search
    EndIf
    guictrlsetdata($label2,"Suche Server: 192.168."&$ip3&"."&$ip4)
    $socket=TCPConnect("192.168."&$ip3&"."&$ip4,27000)
    if $socket<>-1 Then
    $rec=TCPRecv($socket,500)
    if $done[$ip4]<>1 then
    $item[$anz]=GUICtrlCreateListViewItem($rec&"|"&"192.168."&$ip3&"."&$ip4,$ListView1)
    $anz+=1
    $done[$ip4]=1
    EndIf
    EndIf
    $nMsg = GUIGetMsg()
    if $anz>0 then
    for $i=0 to $anz
    if $nmsg=$item[$i] then
    $ip=StringSplit(guictrlread($item[$i]),"|")
    _guictrlipaddress_set($IPAddress1,$ip[2])
    EndIf
    next
    EndIf
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1

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

    $conn=TCPConnect(_GUICtrlIpAddress_Get($ipaddress1),27000)

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

    $rec=TCPRecv($conn,500)
    if $rec="" then
    msgbox(64,"Fehler","Es konnte keine Verbindung hergestellt werden")
    Else
    $answer=msgbox(33,"Verbinden","Verbinden zu "&$rec&@crlf&"Fortsetzen?")
    if $answer=1 then
    $conn=TCPConnect(_GUICtrlIpAddress_Get($ipaddress1),27000)
    $rec=TCPRecv($conn,500)
    if $rec="" then
    msgbox(64,"Fehler","Es konnte keine Verbindung hergestellt werden")
    Else
    tcpsend($conn,"connect")
    ExitLoop
    EndIf
    EndIf
    EndIf
    EndSwitch
    WEnd
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Mit opt("TCPTimeout") geht das nich ....


    Doch, genau dafür ist diese Option gedacht. Der default ist 100 ms, wenn du den nicht änderst, brauchst du die Option auch nicht setzen. Du mußt also als Parameter den gewünschten Wert angeben.

    Edit: Vielleicht solltest du auch einfach mal berücksichtigen, wieviel Zeit die Schleife brauchen kann. ;)
    255 x 255 x 0,1 Sekunden = 6.502,5 s = 1,80625 Stunden !!

  • ich habe den wert von opt("TCPTimeout") auf 1 heuruntergesetzt, was wahrscheinlich nicht reichen wird, das der server eine antwort schickt , aber egal....
    UND jetzt dauert die Suche immernoch 5- 10 Sekunden um eine IP zu überprüfen. Wenn man in dieser Zeit auf einen Butten oder sonst was auf dem GUI drückt, kommt der WIndows Fehler: Das Programm reagiert nicht mehr!

    Wenn es für das Problem keine Lösung gibt: Wie kann ich dann eine "Serversuche" machen ?

    • Offizieller Beitrag

    Also ein TimeOut von 1 verhindert ja das Ausführen der Funktion. So schnell jeht dat nich :D
    Mach doch mal lokal nen Ping auf eine andere Station, die Responsezeiten liegen bei etwa 3-4 ms. Also solltest du dein Timeout im Bereich 5-10 ms ansiedeln.

  • Hi,
    das eigentliche Problem mit der "Antwortzeit" von einem nicht laufenden Serverprozess ist uralt (in div. Newsgroups findet man Threads zu diesem Thema von 1990! ). Hatte mich vor einiger Zeit mal damit beschäfigt, meine Infos zu diesem Thema u.a. in diesem Thread .
    Zusammenfassend: TCPTimeOut hat nichts mit der Antwort(zeit) vom (nicht laufenden) Serverprozess zu tun. Und genau darum geht es. MS benutzt wohl seit Urzeiten diese "dymnamische" Antwortzeitberechnung. Habe daher mal mit MS telefoniert und um einen Vorschlag bzw. Lösungsmöglichkeit gebeten, Info vom (nach dem 3. Weitervermitteln) sehr kompetenten Spezialisten: "...das "Problem" ist bekannt, wird aber von anderen BS ähnlich behandelt, daher kein Handlungsbedarf seitens MS..."
    Steckt also irgendwo in den Tiefen der TCP/IP-Treiber was auch ein Bekannter bestätigt hat der einige MS-Server betreut. Antwortzeiten dort intern wesentlich kürzer (wenn man 2500 Lizenzen kauft, gibts auch "spezielle" Unterstützung^^) , aber extern (über I-net) natürlich genauso lange....
    ciao
    Andy

    Edit:

    Zitat

    also prüfen ob hinter der ip überhaupt ein computer hängt ?

    Dauert idR nur einige Millisekunden, aber das ist nicht das Problem!

    Zitat

    geht das immer so lang wenn kein server auf der ip und dem port existiert.

    DAS ist das Problem!