Socket + Thread erreur

Marko007 Messages postés 96 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 29 janvier 2009 - 29 août 2008 à 08:54
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 - 17 sept. 2008 à 19:46
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

cs_boutemine Messages postés 78 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 21 mars 2018 2
29 août 2008 à 12:22
Au moins tu dois renseigner les méthodes ThreadData ThreadConn pour qu'on peut analyser l'erreur
0
Marko007 Messages postés 96 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 29 janvier 2009
29 août 2008 à 13:12
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
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
29 août 2008 à 13:48
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
0
Marko007 Messages postés 96 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 29 janvier 2009
10 sept. 2008 à 16:31
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Marko007 Messages postés 96 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 29 janvier 2009
16 sept. 2008 à 17:10
Des idées ? Je sèche...

Merci,
Marco
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
16 sept. 2008 à 20:31
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
0
Marko007 Messages postés 96 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 29 janvier 2009
17 sept. 2008 à 11:39
Ok, comment ferais-tu ?

Merci,
Marco
0
cs_akim77 Messages postés 73 Date d'inscription lundi 12 avril 2004 Statut Membre Dernière intervention 17 septembre 2008 4
17 sept. 2008 à 19:46
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
0
Rejoignez-nous