Archief - [PROG]VB.NET tcpclient met timer

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

loopylama

Legacy Member
mijn tcpclient moet connecten op een gegeven ip met een gegeven poort. Maar hij zou maar 5 seconden mogen proberen op dezelfde alvorens een andere ip te kiezen. Iemand die weet hoe dat te programmeren?

connecten lukt alleen de timer werkt niet

klennepette

Legacy Member
Ik denk dat je dan met asynchrone sockets moet werken.
tcpclient heeft naar mijn weten toch geen instelling voor de connection timeout.

Als je toch tcpclient wil gebruiken kan dit op een omslachtige manier :p
(ooit eens nodig gehad)
Code:
Imports System.Net.Sockets
Imports System.Threading

Public Class Form1
    Inherits System.Windows.Forms.Form

 "Windows Form Designer generated code "

    Private tcpClient As tcpClient
    Private thClient As Thread
    Private connected As Boolean
    Private clientHost As String
    Private clientPort As Integer

    Private Sub connect(ByVal host As String, ByVal port As Integer)
        Dim client As New Net.Sockets.TcpClient
        Dim tijd As Long
        Dim timeout As Integer = 5000

        thClient = New Thread(AddressOf connectsocket)
        connected = False
        thClient.Start()

        tijd = Environment.TickCount + timeout
        While tijd > Environment.TickCount
            If connected = True Then

                'verbonden

                thClient.Abort()
                thClient = Nothing
                Exit Sub
            End If
            Application.DoEvents()
        End While
        tcpClient.Close()
        tcpClient = Nothing
        thClient.Abort()
        thClient = Nothing

        'retry
        connect("nieuwip", 123)
    End Sub

    Private Sub connectsocket()
        tcpClient.Connect("localhost", 123)
        connected = True
    End Sub
End Class

loopylama

Legacy Member
klennepette zei:
Ik denk dat je dan met asynchrone sockets moet werken.
tcpclient heeft naar mijn weten toch geen instelling voor de connection timeout.

Als je toch tcpclient wil gebruiken kan dit op een omslachtige manier :p
(ooit eens nodig gehad)
Code:
Imports System.Net.Sockets
Imports System.Threading

Public Class Form1
    Inherits System.Windows.Forms.Form

 "Windows Form Designer generated code "

    Private tcpClient As tcpClient
    Private thClient As Thread
    Private connected As Boolean
    Private clientHost As String
    Private clientPort As Integer

    Private Sub connect(ByVal host As String, ByVal port As Integer)
        Dim client As New Net.Sockets.TcpClient
        Dim tijd As Long
        Dim timeout As Integer = 5000

        thClient = New Thread(AddressOf connectsocket)
        connected = False
        thClient.Start()

        tijd = Environment.TickCount + timeout
        While tijd > Environment.TickCount
            If connected = True Then

                'verbonden

                thClient.Abort()
                thClient = Nothing
                Exit Sub
            End If
            Application.DoEvents()
        End While
        tcpClient.Close()
        tcpClient = Nothing
        thClient.Abort()
        thClient = Nothing

        'retry
        connect("nieuwip", 123)
    End Sub

    Private Sub connectsocket()
        tcpClient.Connect("localhost", 123)
        connected = True
    End Sub
End Class

weigert te werken in vb.net 2005

dit is mijn code zonder de timer:
Code:
Public Sub connect()
        Dim adres As String
        Dim g As New GWC()
        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim aant As Integer
        Const max = 10
        Dim ip As String = ""
        Dim port As String = ""

connecten:
        j = 0
        adres = ""
        

        'tien keer proberen uit de lijst die opgeslagen is
        For aant = 0 To max
            ip = ""
            port = ""
            tcpClient = New System.Net.Sockets.TcpClient()
            adres = g.getHost()
            Trim(adres)

            'kijken of er adressen in de cache zitten
            While IsNumeric(adres.Chars(0)) = False
                g.UpdateHosts()
                Debug.Print("geen nummer op 1")
                adres = g.getHost()
                Trim(adres)
            End While

            'de ip om op te connecten uit de string halen
            For i = 0 To adres.Length - 1
                If adres.Chars(i) <> ":" Then
                    ip += adres.Chars(i)
                Else
                    j = i
                    Exit For
                End If
            Next

            'de poort uit de string halen
            For k = j + 1 To adres.Length - 1
                port += adres.Chars(k)
            Next

            Debug.Print("poort " + port + vbCrLf + "ip " + ip + vbCrLf)


            'proberen te connecten op de ip met de poort
            Try
                tcpClient.Connect(ip, Int32.Parse(port))
                networkStream = tcpClient.GetStream
                Debug.Print("connected")
                If handshaking() = False Then
                    Exit Try
                Else
                    Exit Sub
                End If
            Catch
                Debug.Print("Lukt niet")
                tcpClient.close()
            End Try

        Next

        g.UpdateHosts()
        GoTo connecten



    End Sub

AcIdR3IgN

Legacy Member
en waarom mag je maar 5 seconden wachten.. en dan naar een andere ip? wa probeerde te maken? een of andere bot?

loopylama

Legacy Member
AcIdR3IgN zei:
en waarom mag je maar 5 seconden wachten.. en dan naar een andere ip? wa probeerde te maken? een of andere bot?

ik ben bezig aan een gnutella client. (limewire, bearshare,...)
ik zou graag bewijzen dat dit valt te realiseren met VB.NET.

indien verder informatie gewenst wil ik altijd wel uitleggen wat ik precies van plan ben.

gnutella werkt met zogehete "servents". dit komt vn server en client.
om op het netwerk te connecten (bij het opstarten) moet de client eerst minimum tien adressen uit zijn internet cache aanspreken alvorens de database te raadplegen.

maar als de eerste host niet antwoord duurt het al een eeuwigheid vooraleer mijn programma dat door heeft. het wacht dus enorm lang op een antwoord.
stel je nu eens voort dat er tien zijn die niet antwoorden. dan duurt het connecten al gauw een paar minuten.

met een time-out zouden de eerste 10 max 10* het aantal seconden duren. dus dan kan ik de connectietijd enorm reduceren.

ik hoop dat je mij kan volgen?

BuiZe

Legacy Member
how 'bout this:
Code:
Imports System.Net.Sockets

Public Class Form1

    Private client() As TcpClient

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i As Integer
        ReDim client(0 To 9)
        For i = 0 To 9
            client(i) = New TcpClient
            client(i).BeginConnect("192.168.0.16", 80, New AsyncCallback(AddressOf callback), i)
        Next

        'ergens een timer de verbinding laten sluiten:
        If Not client(5).Connected Then client(5).Close()
        If Not client(6).Connected Then client(6).Close()

    End Sub

    Private Sub callback(ByVal ar As IAsyncResult)
        Dim i As Integer = CType(ar.AsyncState, Integer)
        If client(i).Client Is Nothing Then
            Debug.Print("Connection for client " & i & " was closed (timeout)")
        Else
            Debug.Print("Client " & i & " connected=" & client(i).Connected)
        End If
    End Sub
End Class
Meteen 10 connectie-aanvragen tegelijk (naar de aparte 'servents') en nadien de gebeurtenissen opvangen (verbinding verbroken door timer of verbinding geslaagd).

loopylama

Legacy Member
BuiZe zei:
how 'bout this:
Code:
Imports System.Net.Sockets

Public Class Form1

    Private client() As TcpClient

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i As Integer
        ReDim client(0 To 9)
        For i = 0 To 9
            client(i) = New TcpClient
            client(i).BeginConnect("192.168.0.16", 80, New AsyncCallback(AddressOf callback), i)
        Next

        'ergens een timer de verbinding laten sluiten:
        If Not client(5).Connected Then client(5).Close()
        If Not client(6).Connected Then client(6).Close()

    End Sub

    Private Sub callback(ByVal ar As IAsyncResult)
        Dim i As Integer = CType(ar.AsyncState, Integer)
        If client(i).Client Is Nothing Then
            Debug.Print("Connection for client " & i & " was closed (timeout)")
        Else
            Debug.Print("Client " & i & " connected=" & client(i).Connected)
        End If
    End Sub
End Class
Meteen 10 connectie-aanvragen tegelijk (naar de aparte 'servents') en nadien de gebeurtenissen opvangen (verbinding verbroken door timer of verbinding geslaagd).


wr kunde den timer instellen?

BuiZe

Legacy Member
Mijn kennis van VB.NET reikt niet zover als die van VB6, maar het komt er op neer ofwel een timercontrol op je form ofwel een timerobject in code te maken. Na de For die de BeginConnect's aanroept, start je de timer, die bij het optreden van het timerevent alle connecties i sluit die niet gemaakt zijn:
If Not client(i).Connected Then client(i).Close()

Close() genereert blijkbaar ook de callback, dus je kan daarin alles afvangen.

DemonDesign

Legacy Member
:x Im looking for a couple people I need Help From.

: Demogorgon : Crypt Keeper : Time Lord : Garbageheap :

PLZ I need help Programing Something For "School"
:x

loopylama

Legacy Member
BuiZe zei:
Mijn kennis van VB.NET reikt niet zover als die van VB6, maar het komt er op neer ofwel een timercontrol op je form ofwel een timerobject in code te maken. Na de For die de BeginConnect's aanroept, start je de timer, die bij het optreden van het timerevent alle connecties i sluit die niet gemaakt zijn:
If Not client(i).Connected Then client(i).Close()

Close() genereert blijkbaar ook de callback, dus je kan daarin alles afvangen.

kheb het opgelost met thread.sleep(300)

en als er dan gn connectie is de client sluiten anders de networkstream eruit zoeken en berichten zenden

Duffman-

Legacy Member
DemonDesign zei:
:x Im looking for a couple people I need Help From.

: Demogorgon : Crypt Keeper : Time Lord : Garbageheap :

PLZ I need help Programing Something For "School"
:x
and what is it exactly that has to be programmed?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan