Socket + Thread erreur

Signaler
Messages postés
96
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
29 janvier 2009
-
Messages postés
73
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
17 septembre 2008
-
J'ai un message d'erreur :

"Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port)
est habituellement autorisée."

Mon application possède deux forms, qui se "Form.SHOW" et se "Me.CLOSE" avec :

FormLoad =

    Dim tcpClientConnect As TcpClient
    Dim port As Int32 = 23
    Dim localAddr As IPAddress = IPAddress.Any  '.Parse("10.50.11.3")
    Dim TcpServer As New TcpListener(localAddr, port)
    Dim stream As NetworkStream
    Private trd1 As New Thread(AddressOf ThreadConn) 'New thread
    Private trd2 As New Thread(AddressOf ThreadData) 'New thread
    Dim Thrdata As [String] = Nothing 'New thread
    Dim Thrconn As [String] = Nothing 'New thread

        TcpServer.Start()

        If trd1.ThreadState <> ThreadState.Running Then

            Threading.Thread.Sleep(1000)
            trd1.IsBackground = True
            trd1.Start()

        End If

Des idées, pour éviter cela ?

Merci,
Marco

8 réponses

Messages postés
78
Date d'inscription
dimanche 8 mai 2005
Statut
Membre
Dernière intervention
21 mars 2018
1
Au moins tu dois renseigner les méthodes ThreadData ThreadConn pour qu'on peut analyser l'erreur
Messages postés
96
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
29 janvier 2009

Volià :

    Private Sub ThreadData()
        Dim i As Integer
        Dim bytes(1024) As [Byte]

        Try
            Do

                i = 0
                'Thrdata = ""
                stream = tcpClientConnect.GetStream()
                i = stream.Read(bytes, 0, bytes.Length)

                If tcpClientConnect.Connected = False Then Exit Do

                If i <> 0 Then

                    Thrdata = Thrdata & Encoding.ASCII.GetString(bytes, 0, i)

                    If StrName = "" And Thrdata <> "*****" & vbCrLf And IntCarUser < 6 Then
                        IntCarUser = IntCarUser + 1

                    End If
                    If StrName "*****" And StrPassword "" And Thrdata <> "**" & vbCrLf And IntCarPassword < 3 Then
                        IntCarPassword = IntCarPassword + 1

                    End If
                    If StrName "" And Thrdata "*****" & vbCrLf And IntCarUser >= 5 Then
                        StrName = "*****"
                        Thrdata = ""
                        IntCarUser = 0

                       
                    End If
                    If StrName "*****" And StrPassword "" And Thrdata = "**" & vbCrLf And IntCarPassword >= 2 Then
                        StrPassword = "**"
                        Thrdata = ""
                        IntCarPassword = 0

                    End If

                    'Error UserName                    If StrName "" And Thrdata <> "*****" & vbCrLf And IntCarUser 6 Then
                        Thrdata = ""
                        IntCarUser = 0

                    End If

                    'Error Password                    If StrName "*****" And StrPassword "" And Thrdata <> "**" & vbCrLf And IntCarPassword = 3 Then
                        Thrdata = ""
                        IntCarPassword = 0

                    End If

                    If IntCarUser >= 7 Then
                        IntCarUser = 0
                    End If

                    If IntCarPassword >= 4 Then
                        IntCarPassword = 0
                    End If
                    If StrName "*****" And StrPassword "**" Then
                        MSComm1.Output = Thrdata
                        Thrdata = ""
                    End If

                End If

            Loop

        Catch ex As Exception

        End Try
    End Sub

    Private Sub ThreadConn()

        If TcpServer.Pending <> True Then

            tcpClientConnect = TcpServer.AcceptTcpClient
            Try
                stream = tcpClientConnect.GetStream()

 
                trd2.IsBackground = True
                trd2.Start()
   
            Catch ex As Exception

            End Try
        End If

    End Sub

Merci,
Marco
Messages postés
73
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
17 septembre 2008
4
Salut,

Pour être sûr qu'il n'y a pas un autre logiciel  à l'écoute de ton port 23 (Telnet).

Utilise la methode suivante:
 - menu Démarrer/Exécuter, cmd + <Entrée>
 - dans la nouvelle fenêtre, netstat -ano + <Entrée>
 - dans la colonne Adresse locale, cherche celle qui se termine par :23
et note la valeur correspondante dans la dernière colonne (colonne sans
nom, chez moi)
 - fais ensuite tasklist + <Entrée>
 - cherche dans la colonne PID la valeur notée deux lignes plus haut et
regarde dans la première colonne le nom du logiciel qui squatte le port
23...

Si tu ne trouve pas le port 23, tu pourras chercher dans ton code pourquoi
il tente d'ouvrir plusieurs fois une connexion sur le port 23.

A+

Akim
Messages postés
96
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
29 janvier 2009

Aucun autre logiciel qui écoute au niveau du port 23 (telnet).

Ce qui se passe, c'est à mon avis ceci : En faisant plusieurs fois un LOAD et CLOSE d'une forme qui execute un thread
gérant une connexion tcpclient + getstream, on atteint le nbre maximum d' utilisation de chaque adresse de socket (protocole/adresse réseau/port) habituellement autorisée... Et cela bug..

Des idées ?
Marco
Messages postés
96
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
29 janvier 2009

Des idées ? Je sèche...

Merci,
Marco
Messages postés
73
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
17 septembre 2008
4
Salut,

Tant pis si c'est une lapalissade, mais pourquoi ne pas fermer la connexion pendant le
CLOSE de la forme (qui execute un thread ....................), à priori elle devient inutile.

Akim
Messages postés
96
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
29 janvier 2009

Ok, comment ferais-tu ?

Merci,
Marco
Messages postés
73
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
17 septembre 2008
4
Salut,





Dans une class Form1 tu aurais quelque chose comme çà:




Private



Sub
Form1_FormClosing(

ByVal
sender

As



Object
,

ByVal
e

As
System.Windows.Forms.FormClosingEventArgs)

Handles



Me
.FormClosing
        '.................................
        tcpClientConnect.Close()
        TcpServer.Stop()
       ' .................................






End



Sub



Akim