Bonjour,

Mon objectif est d'envoyer des informations à un service pour qu'il effectue des opérations.

J'ai donc créé deux fonctions:
une pour l'allé-retour (l'application envoie un texte qui va être lu par le service qui va effectuer l'opération et renvoyer une information) et une pour l'allé (l'application envoie l'information et le service exécute l'opération demandée et il n'y a pas de variable retournée).

Voici le code de ses fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
Public Sub alle(ByVal valEnv As String)
        Dim Log As New LogGenerator
        Try
            Dim textFinal As String = PreparEnvoie(valEnv)
            Dim content(1024) As Byte
            content = System.Text.Encoding.ASCII.GetBytes(textFinal.ToCharArray())
            Dim client As New Net.Sockets.TcpClient()
            'Le client va lancer la fonction SendCallBack'
            Dim EndPoint As Net.IPEndPoint
            Dim ipLocale As Long = 16777343
            EndPoint = New Net.IPEndPoint(ipLocale, 1039)
            client.Connect(EndPoint)
            Dim flux As Net.Sockets.NetworkStream = client.GetStream()
            flux.Write(content, 0, content.Length)
            flux.Flush()
            flux.Close()
            client.Close()
        Catch ex As Exception
            Log.trace(ex.ToString)
        End Try
    End Sub
 
    Public Function alleRetour(ByVal valEnv As String) As String
        Dim log As New LogGenerator
        Try
            Dim textFinal As String = PreparEnvoie(valEnv)
            Dim content(1024) As Byte
            Dim content2(1024) As Byte
            content = System.Text.Encoding.ASCII.GetBytes(textFinal.ToCharArray())
            Dim client As New Net.Sockets.TcpClient()
            'Le client va lancer la fonction SendCallBack'
            Dim EndPoint As Net.IPEndPoint
            Dim ipLocale As Long = 16777343
            EndPoint = New Net.IPEndPoint(ipLocale, 1039)
            client.Connect(EndPoint)
            Dim flux As Net.Sockets.NetworkStream = client.GetStream()
            flux.Write(content, 0, content.Length)
            flux.Read(content2, 0, content2.Length)
            Dim retour As String = System.Text.Encoding.ASCII.GetString(content2)
            Dim retour2 As String() = retour.Split("#")
            Return retour2(0)
            flux.Flush()
            flux.Close()
            client.Close()
        Catch ex As Exception
            Log.trace(ex.ToString)
        End Try
    End Function
(la fonction prepareenvoie n'a pas d'importance, le probleme ne venant pas de là)

Il est à noter que j'envoie au service un nom d'opération à exécuter sous la forme : "operation#" ce qui me permet de rajouter des données après le # dans le cas où j'ai des données à joindre (par exemple pour une fonction de set).

Maintenant le service qui est sous cette forme
Ici aussi la fonction decrypt n'a pas d'importance, ce n'est pas là qu'est le problème.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Public Class Service1

    '--------------------------------- Declaration de variables -----------------------------------
    Public reception As New Threading.ManualResetEvent(False)
    Private listener As Net.Sockets.TcpListener
    Const PORT_NUM As Integer = 1039
    Dim EndPoint As Net.IPEndPoint
    Dim valArenvoyer As String


    '---Fonction au demarrage du service :Lancement du thread correspondant à la fonction "General" et qui va tourner en boucle---
    Protected Overrides Sub OnStart(ByVal args() As String)
        Dim thread As New System.Threading.Thread(AddressOf General)
        thread.IsBackground = True
        thread.Start()
    End Sub

    '----------------------------Thread qui va tourner en boucle et attendre une connexion d'un client-------------------
    Public Sub General()

        Dim ipLocale As Long = 16777343
        EndPoint = New Net.IPEndPoint(ipLocale, 1039)
        Dim listener As New TcpListener(EndPoint)
        listener.Start()

        While True
            reception.Reset()
            listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf AcceptCallback), listener)
            reception.WaitOne()
        End While
    End Sub


    Public Sub AcceptCallback(ByVal ar As IAsyncResult)
        Try
            Dim log As log4Raid
            log = New log4Raid("C:\User\U349428\Documents\Visual Studio 2005\Projects\EssServ\log", "Log")

            Dim bit(1024) As Byte
            Dim biit(1024) As Byte
            Dim listener As TcpListener = CType(ar.AsyncState, TcpListener)
            Dim client As TcpClient = listener.EndAcceptTcpClient(ar)
            Dim stream As NetworkStream = client.GetStream()
            stream.Read(bit, 0, bit.Length)
            Dim valeurrecue As String = System.Text.Encoding.ASCII.GetString(bit)
            Dim valeurrecue2 As String = Decrypt(valeurrecue)

            Select Case valeurrecue2

             (cas d'un aller sans donnee)       
                Case "operation1"       
                    setAutoSystem("true") 'on effectue l'opération associée'
                    stream.Flush()
                    stream.Close()
                    client.Close()
               
                (cas d'un allerretour)       
                Case "operation2"
                    Dim droitAdm As String = verifieDroitAdmin() + "#"
                    biit = System.Text.Encoding.ASCII.GetBytes(droitAdm.ToCharArray())
                    stream.Write(biit, 0, biit.Length)
                    stream.Flush()
                    stream.Close()
                    client.Close()

 (cas d'un allerr vec donnees)     
                 Case Else
                    If (valeurrecue2.StartsWith("operation3")) Then
                        Dim valeur As String = valeurrecue2.Substring(11)
                    ' le substring sert à récupérer la valeur de l'aller avec donnée)
                        runApplication(valeur) 'on effectue l'operation
                        stream.Flush()
                        stream.Close()
                        client.Close()
                    End If

             End Select

            reception.Set()

        Catch ex As Exception
        End Try
    
End Sub
Mon problème est que quand je lance une opération d'aller retour je récupère bien la valeur dans mon application. Cependant si je la relance plus tard, je ne récupère rien et le programme ne répond plus.

Prenons un exemple,

dans mon code j'ai cela en bleu qui me renvoie bien une valeur true :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
If (CBool(alleRetour("verifDroitAdmin")) = False)
Or, apres, quand j'effectue cette operation, cela plante :

"MajVariablesEnvironnements(getidAddinByLibapp(MenuApp13.Text), CBool(alleRetour("verifDroitAdmin")))"
(si je remplace le CBool(alleRetour("verifDroitAdmin")) par True ou False, cela marche ce qui signifie que le probleme vient de là normalement)

Merci d'avance pour votre aide et vos conseils