Comment faire pour utiliser des canaux nommés pour la communication interprocessus dans Visual Basic .NET ou Visual Basic 2005

Résumé

Cet article étape par étape explique comment utiliser des canaux nommés pour la communication interprocessus dans Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005. Cet article inclut un exemple de code qui illustre la communication client/serveur à l’aide d’un canal nommé dans Visual Basic .NET ou Visual Basic 2005. Cet article décrit la communication entre processus en créant un serveur de canaux nommé et un client de canal nommé. La communication sur le canal s’effectue de la manière suivante :
  • Créer un canal nommé.
  • Bloquer l’application serveur à l’aide de la fonction ConnectNamedPipe jusqu'à ce qu’un client se connecte.
  • Se connecter au serveur à l’aide de la fonction CallNamedPipe.
  • Appelez la fonction ReadFile ou WriteFile pour communiquer sur le canal.
  • Appelez la fonction DisconnectNamedPipe lorsque la fin du processus en utilisant le canal de communication.
  • Appelez la fonction CloseHandle sur le canal nommé issue de communiquer sur le canal.

INTRODUCTION

Un canal nommé est un canal unidirectionnel ou bi-directionnels pour une communication entre un serveur de canaux et un ou plusieurs clients de canaux. Vous pouvez les utilisateur de canaux nommé pour permettre la communication entre processus sur le même ordinateur ou entre les processus de divers ordinateurs sur un réseau. Le terme « nommé serveur de canaux » fait référence à un processus qui crée un canal nommé et le terme « nommé client de canal » fait référence à un processus qui se connecte à une instance d’un canal nommé.


Vous pouvez utiliser Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 pour créer des applications qui communiquent avec les autres processus à l’aide de canaux nommés. Cet article contient un exemple de code qui utilise un canal nommé pour communiquer entre deux applications de Visual Basic .NET ou Visual Basic 2005 Windows.

Retour au début

Configuration requise

Cet article suppose que vous maîtrisez les sujets suivants :
  • Applications Windows
  • Programmation de Visual Basic .NET
  • L’utilisation de canaux
La liste suivante met en évidence le matériel recommandé, logiciel, infrastructure réseau et les service packs dont vous avez besoin :
  • Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005
  • Microsoft.NET Framework
Retour au début

Créer un serveur de canal nommé

Pour créer un serveur de canaux nommé et ensuite communiquer avec le client sur le canal, procédez comme suit :
  1. Créer un canal nommé.
  2. Appelez la fonction ConnectNamedPipe pour bloquer le serveur jusqu'à ce qu’un client se connecte.
  3. Appelez la fonction ReadFile ou WriteFile pour communiquer sur le canal.
  4. Appelez la fonction DisconnectNamedPipe lorsque la fin du processus en utilisant le canal de communication.
  5. Appelez la fonction CloseHandle sur le canal nommé.
Retour au début

Conception d’une application Windows qui crée un serveur de canal nommé

Pour créer une application Windows qui crée un serveur de canal nommé à l’aide de Visual Basic .NET ou Visual Basic 2005, procédez comme suit :
  1. Démarrez Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.
  3. Sous Types de projets, cliquez sur Projets de Visual Basic, puis cliquez sur Application Windows sous modèles.

    Remarque Dans Visual Studio 2005, cliquez sur Visual Basic sous Types de projets.
  4. Dans la zone nom , tapez MyServerApp, puis cliquez sur OK. Par défaut, un formulaire appelé Form1 est créé.
  5. Ajoutez trois contrôles de bouton au formulaire Form1.
  6. Dans le menu affichage , cliquez sur Fenêtre Propriétés.
  7. Définissez la propriété Text des contrôles bouton sur les valeurs suivantes :
    NomTexte
    Button1Créer un canal nommé
    Button2Attente des connexions client
    Button3Déconnecter le serveur
  8. Ajoutez un contrôle Label au formulaire Form1 . Le contrôle Label1 étiquette est ajouté au formulaire Form1.
Retour au début

Ajoutez toutes les déclarations d’un module dans l’application Windows

Pour ajouter les déclarations des fonctions qui sont requises pour implémenter la communication entre processus à l’aide du canal nommé, procédez comme suit :
  1. Dans l’Explorateur de solutions, droit sur MyServerApp, pointez sur Ajouter, puis cliquez sur Ajouter un Module.
  2. Dans la boîte de dialogue Ajouter un nouvel élément - MyServerApp , cliquez sur Ouvrir.
  3. Ajoutez le code suivant au module Module1.vb :
    Public Const FILE_ATTRIBUTE_NORMAL As Short = &H80SPublic Const FILE_FLAG_NO_BUFFERING As Integer = &H20000000
    Public Const FILE_FLAG_WRITE_THROUGH As Integer = &H80000000

    Public Const PIPE_ACCESS_DUPLEX As Short = &H3S
    Public Const PIPE_READMODE_MESSAGE As Short = &H2S
    Public Const PIPE_TYPE_MESSAGE As Short = &H4S
    Public Const PIPE_WAIT As Short = &H0S

    Public Const INVALID_HANDLE_VALUE As Short = -1

    Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" _
    (ByVal lpName As String, ByVal dwOpenMode As Integer, _
    ByVal dwPipeMode As Integer, ByVal nMaxInstances As Integer, _
    ByVal nOutBufferSize As Integer, ByVal nInBufferSize As Integer, _
    ByVal nDefaultTimeOut As Integer, ByVal lpSecurityAttributes As IntPtr _
    ) As Integer

    Declare Function ConnectNamedPipe Lib "kernel32" _
    (ByVal hNamedPipe As Integer, ByVal lpOverlapped As Integer) As Integer

    Declare Function DisconnectNamedPipe Lib "kernel32" _
    (ByVal hNamedPipe As Integer) As Integer

    Declare Function WriteFile Lib "kernel32" _
    (ByVal hFile As Integer, ByRef lpBuffer() As Byte, _
    ByVal nNumberOfBytesToWrite As Integer, ByRef lpNumberOfBytesWritten As Integer, _
    ByVal lpOverlapped As Integer _
    ) As Integer

    Declare Function ReadFile Lib "kernel32" _
    (ByVal hFile As Integer, ByRef lpBuffer As Integer, _
    ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, _
    ByVal lpOverlapped As Integer _
    ) As Integer

    Declare Function FlushFileBuffers Lib "kernel32" _
    (ByVal hFile As Integer) As Integer

    Declare Function CloseHandle Lib "kernel32" _
    (ByVal hObject As Integer) As Integer

Retour au début

Écrire du code pour créer un serveur de canal nommé

Après avoir créé un canal nommé, attendez que les connexions à partir du client. Lorsque le client se connecte au serveur, lire ou écrire les données sur le canal. Pour ce faire, procédez comme suit :
  1. Dans l’Explorateur de solutions, cliquez sur Form1, puis cliquez sur Ouvrir.
  2. Dans le formulaire Form1 en mode Design, double-cliquez sur créer un canal nomméet puis ajoutez le code suivant à la procédure Button1_Click :
    Dim openMode, pipeMode As Integer'Create the named pipe
    openMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH
    pipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE
    hPipe = CreateNamedPipe(pipeName, openMode, pipeMode, 10, 10000, 2000, 10000, IntPtr.Zero)
    Label1.Text = "Created the named pipe and waiting for the clients."
    Button1.Visible = False
    Button2.Visible = True
    Button3.Visible = True
  3. Ajoutez le code suivant avant la procédure Button1_Click :
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Short = 10000
    Private Buffer(BUFFSIZE) As Byte
    Private hPipe As Integer
  4. Dans l’Explorateur de solutions, double-cliquez sur Form1.vb.
  5. Dans le formulaire Form1 en mode Design, double-cliquez sur attendre que les connexions clienteset puis ajoutez le code suivant à la procédure Button2_Click :
    Dim byteCount, i, res, cbnCount As IntegerFor i = 0 To BUFFSIZE - 1 'Fill an array of numbers
    Buffer(i) = i Mod 256
    Next i
    'Wait for a connection, block until a client connects
    Label1.Text = "Waiting for client connections"
    Me.Refresh()
    Do
    res = ConnectNamedPipe(hPipe, 0)
    'Read the data sent by the client over the pipe
    cbnCount = 4
    res = ReadFile(hPipe, byteCount, Len(byteCount), cbnCount, 0)
    If byteCount > BUFFSIZE Then 'Client requested for byteCount bytes
    byteCount = BUFFSIZE 'but only send up to 20000 bytes
    End If
    'Write the number of bytes requested by the client
    res = WriteFile(hPipe, Buffer, byteCount, cbnCount, 0)
    res = FlushFileBuffers(hPipe)
    'Disconnect the named pipe.
    res = DisconnectNamedPipe(hPipe)
    'Loop until the client makes no more requests for data.
    Loop Until byteCount = 0
    Label1.Text = "Read or Write completed"
    Button2.Visible = False
  6. En mode Design, double-cliquez sur Form1, puis ajoutez le code suivant à la procédure Form1_Load :
    Button2.Visible = FalseButton3.Visible = False
  7. Dans l’Explorateur de solutions, double-cliquez sur Form1.vb.
  8. Dans le formulaire Form1 en mode Design, double-cliquez sur se déconnecter du serveuret puis ajoutez le code suivant à la procédure Button3_Click :
    Dim res As Integer'Close the pipe handle when the client makes no requests
    CloseHandle(hPipe)
    Label1.Text = "Disconnected the named pipe"
  9. Dans le menu Générer , cliquez sur Générer la Solution.
Retour au début

Créer un client de canal nommé

Pour créer un client de canal nommé qui communique avec le serveur, procédez comme suit :
  1. Appelez la fonction CreateFile pour créer un handle vers le canal nommé.
  2. Appelez la fonction ReadFile ou WriteFile pour communiquer sur le canal.
  3. Appeler la fonction CloseHandle sur le handle qui est créé dans la fonction CreateFile .
Vous pouvez également utiliser une transaction de canal nommé pour la communication client/serveur. La transaction de canal nommé combine une opération d’écriture et une opération de lecture dans une opération de réseau unique. Une transaction peut être utilisée uniquement sur un canal duplex, de type de message. Processus peuvent utiliser la fonction TransactNamedPipe ou CallNamedPipe pour effectuer les opérations de canal nommé.


Dans cet exemple de code, vous utilisez la fonction CallNamedPipe pour se connecter au serveur de canal nommé, écrire les données dans le canal de communication et puis de lire les données depuis le canal.

Retour au début

Conception d’une application Windows qui communique avec le serveur de canal nommé

Pour créer une application Visual Basic .NET ou Visual Basic 2005 Windows qui est utilisée pour se connecter au serveur de canal nommé, procédez comme suit :
  1. Démarrez Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.
  3. Sous Types de projets, cliquez sur Projets de Visual Basic, puis cliquez sur Application Windows sous modèles.

    Remarque Dans Visual Studio 2005, cliquez sur Visual Basic sous Types de projets.
  4. Dans la zone nom , tapez MyClientApp, puis cliquez sur OK. Par défaut, un formulaire appelé Form1 est créé.
  5. Ajoutez un contrôle Button au formulaire Form1.
  6. Cliquez sur Button1, puis cliquez sur Propriétés.
  7. Définissez la propriété Text pour se connecter au serveur.
  8. Ajoutez un contrôle Label au formulaire Form1. Le contrôle Label1 étiquette est ajouté au formulaire Form1 .
  9. La propriété Visible du contrôle Label1 étiquette la valeur false.
  10. Ajoutez deux contrôles de zone de texte au formulaire Form1.
Retour au début

Écrire du code pour se connecter au serveur de canal nommé

Se connecter au serveur de canal nommé à l’aide de la fonction CallNamedPipe . Après la connexion au serveur, la CallNamedPipe fonction écrit dans le canal, lit depuis le canal et puis ferme le canal de communication. Pour se connecter au serveur, puis lire ou écrire les données, procédez comme suit :
  1. En mode Design, double-cliquez sur la connexion au serveuret puis ajoutez le code suivant à la procédure Button1_Click :
    Dim i, res, cbRead,numBytes As IntegerDim bArray() As Byte
    Dim temp As String

    numBytes = CInt(TextBox1.Text)
    If numBytes < 0 Then
    MessageBox.Show("Value must be at least 0.", MsgBoxStyle.OKOnly)
    Exit Sub
    End If
    If numBytes = 0 Then
    Label1.Visible = True
    Label1.Text = "The connection to the server is disconnected."
    Button1.Visible = False
    TextBox1.Visible = False
    TextBox2.Visible = False
    End If
    If numBytes > BUFFSIZE Then
    numBytes = BUFFSIZE
    End If

    ReDim bArray(numBytes) 'Create the return buffer
    'Call the CallNamedPipe function to do the transactions
    res = CallNamedPipe(pipeName, numBytes, Len(numBytes), bArray(0), numBytes, cbRead, 30000)
    'Wait up to 30 seconds for a response
    'Format the data received, and then display the data in the text box
    If res > 0 Then
    temp = Format(bArray(0), " 000")
    For i = 1 To cbRead - 1
    If (i Mod 16) = 0 Then temp = temp & vbCrLf
    temp = temp & " " & Format(bArray(i), "000")
    Next i
    TextBox2.Text = temp
    Else
    MessageBox.Show("Error number " & Err.LastDllError & _
    "while trying to call the CallNamedPipe function.", MsgBoxStyle.OKOnly)
    End If
  2. Ajoutez le code suivant avant la procédure Button1_Click :
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Integer = 10000
    Private hpipe As Integer

    Public Const INVALID_HANDLE_VALUE As Short = -1
    Public Declare Function CallNamedPipe Lib "kernel32" Alias "CallNamedPipeA" _
    (ByVal lpNamedPipeName As String, _
    ByRef lpInBuffer As Integer, _
    ByVal nInBufferSize As Integer, _
    ByRef lpOutBuffer As Byte, _
    ByVal nOutBufferSize As Integer, _
    ByRef lpBytesRead As Integer, ByVal nTimeOut As Integer) As Integer
  3. Dans le menu Générer , cliquez sur Générer la Solution.
Retour au début

Vérifiez que le code fonctionne.

Pour vérifier que votre code fonctionne, procédez comme suit :
  1. Pour démarrer l’application serveur, cliquez sur Démarrer dans le menu Déboguer du projet MyServerApp.
  2. Dans le formulaire Form1, cliquez sur créer un canal nommé, puis cliquez sur attendre pour les connexions client. L’application est désormais bloquée et attend que le client se connecte.
  3. Pour démarrer l’application cliente, cliquez sur Démarrer dans le menu Déboguer du projet MyClientApp.
  4. Dans le formulaire Form1, tapez 10 dans la zone de TextBox1 et puis cliquez sur se connecter au serveur. Vous pouvez voir le tableau d’octets qui est reçu dans la boîte de TextBox2 .
  5. Pour vous déconnecter de l’application cliente à partir du serveur, tapez 0 dans la TextBox1 zone dans l’application client, puis cliquez sur se connecter au serveur.
  6. Fermez l’application client.
  7. Pour déconnecter l’extrémité serveur du canal nommé, puis fermez l’application serveur, cliquez sur déconnecter le serveur du formulaire Form1 de l’application serveur.
Retour au début

Références

Pour plus d'informations, visitez les sites Web de Microsoft Developer Network (MSDN) suivant :Retour au début
Propriétés

ID d'article : 871044 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Commentaires