Использование именованных каналов для взаимодействия между процессами в Visual Basic .NET или Visual Basic 2005

Переводы статьи Переводы статьи
Код статьи: 871044 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье описывается использование именованных каналов в Microsoft Visual Basic .NET и Microsoft Visual Basic 2005 для межпроцессного взаимодействия. Данная статья содержит пример кода, демонстрирующий связи клиент сервер с помощью именованного канала в Visual Basic .NET или Visual Basic 2005. В статье описывается межпроцессного взаимодействия путем создания именованного канала клиента и сервера именованного канала. Связь по каналу осуществляется следующим образом:
  • Создание именованного канала.
  • Блокировать серверное приложение, клиент подключается с помощью функции ConnectNamedPipe.
  • Подключиться к серверу с помощью функции CallNamedPipe.
  • Вызов функции ReadFile или функции WriteFile для связи через канал.
  • По завершении процесса использованию канала, вызовите функцию DisconnectNamedPipe.
  • После завершения связи через канал, вызовите функцию CloseHandle по именованному каналу.

ВВЕДЕНИЕ

Именованный канал является односторонней или двусторонней канал для обмена данными между сервером и одним или несколькими клиентами. Имеется возможность пользователю именованные каналы обеспечивают связь между процессами на одном компьютере или между процессами на разных компьютерах в сети.Термин "с именем сервера канала" ссылается на процесс, который создает именованный канал, а термин "с именем клиента канала" относится к процессу, который подключается к экземпляру именованного канала.

Microsoft Visual Basic .NET и Microsoft Visual Basic 2005 можно использовать для создания приложений, взаимодействующих с другими процессами с помощью именованных каналов. В данной статье содержится пример кода, который использует именованный канал для обмена данными между двумя приложениями Visual Basic .NET и Visual Basic 2005 Windows.

Требования

Предполагается, что вы знакомы со следующими темами:
  • Приложения Windows
  • Программирование на Visual Basic .NET
  • С помощью каналов
В следующем списке представлены рекомендуемое оборудование, программное обеспечение, сетевая инфраструктура и пакеты обновления, которые будут необходимы.
  • Microsoft Visual Studio .NET и Microsoft Visual Studio 2005
  • Платформа.NET Framework корпорации Майкрософт

Создание сервера именованного канала

Для создания сервера именованного канала и затем обмениваются данными с клиентами через канал, выполните следующие действия.
  1. Создание именованного канала.
  2. Вызов функции ConnectNamedPipe для блокирования сервером до подключения клиента.
  3. Вызов функции ReadFile или функции WriteFile для связи через канал.
  4. По завершении процесса использованию канала, вызовите функцию DisconnectNamedPipe .
  5. Вызов функции CloseHandle для именованного канала.

Разрабатывать приложения Windows, которое создается сервером именованного канала

Для создания приложения Windows, которое создается с помощью Visual Basic .NET или Visual Basic 2005 сервера именованного канала, выполните следующие действия.
  1. Запустите Microsoft Visual Studio .NET или Microsoft Visual Studio 2005.
  2. В меню Файл выберите команду Создать, а затем — пункт Проект
  3. В области Типы проектоввыберите Проекты Visual Basicи в списке Шаблонывыберите Приложение Windows .

    Примечание В Visual Studio 2005 выберите в списке Типы проектовVisual Basic .
  4. В поле имя введите MyServerApp, а затем нажмите кнопку ОК. По умолчанию создается форма с именем Form1.
  5. В форму Form1 добавьте три элемента управления Button .
  6. В меню Вид пункт Окно свойств.
  7. Свойство Text элемента управления Button задайте следующие значения:
    Свернуть эту таблицуРазвернуть эту таблицу
    ИмяТекст
    Button1Создание именованного канала
    Button2Подождите, пока клиентских подключений
    Button3Отключите сервер
  8. Добавьте элемент управления Label в форму Form1 . Элемент управления Label1 Метка добавляется на форму Form1.

Добавьте все объявления модуля в приложении Windows

Добавление объявления функций, которые необходимы для реализации связи между процессами с помощью именованного канала, выполните следующие действия.
  1. В обозревателе решений щелкните правой кнопкой мыши MyServerApp, укажите пункт Добавитьи выберите команду Добавить модуль.
  2. В диалоговом окне Добавление нового элемента - MyServerApp нажмите кнопку Открыть.
  3. В модуле Module1.vb добавьте следующий код:
    Public Const FILE_ATTRIBUTE_NORMAL As Short = &H80S
    Public 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
    

Написание кода для создания именованного канала сервера

После создания именованного канала, дождитесь подключения от клиента. Когда клиент подключается к серверу, чтения и записи данных через канал. Чтобы сделать это, выполните следующие действия.
  1. В обозревателе решений щелкните правой кнопкой мыши форму Form1и нажмите кнопку Открыть.
  2. В режиме конструктора формы Form1 дважды щелкните Создать именованный канали затем добавьте следующий код к процедуре 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. Добавьте следующий код перед процедуре 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. В обозревателе решений дважды щелкните Form1.vb.
  5. В режиме конструктора формы Form1 дважды щелкните значок ожидания клиентских подключенийи процедуру Button2_Click добавьте следующий код:
    Dim byteCount, i, res, cbnCount As Integer
    For 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. В режиме конструктора дважды щелкните Form1и затем добавьте следующий код к процедуре Form1_Load :
    Button2.Visible = False
    Button3.Visible = False
  7. В обозревателе решений дважды щелкните Form1.vb.
  8. В режиме конструктора формы Form1 дважды щелкните Отключить сервери затем добавьте следующий код к процедуре 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. В меню Построение выберите команду Построить решение.

Создание именованного канала клиента

Чтобы создать именованный канал клиента, который взаимодействует с сервером, выполните следующие действия.
  1. Вызовите функцию CreateFile , чтобы создать дескриптор именованного канала.
  2. Вызов функции ReadFile или функции WriteFile для связи через канал.
  3. Дескриптор, созданный в функции CreateFile вызова функции CloseHandle .
Можно также использовать транзакции именованных каналов для связи клиента и сервера. Транзакции именованных каналов объединяет операции чтения в одной сети операции и операции записи. Транзакции можно использовать только на канал дуплекс, тип сообщения. Процессы можно использовать функцию TransactNamedPipe или CallNamedPipe функции для выполнения транзакций именованного канала.

В этом примере функция CallNamedPipe используется для подключения сервера именованного канала, запись данных в канал и затем чтение данных из канала.

Разрабатывать приложения Windows, которое взаимодействует с сервером именованного канала

Для разработки приложения Visual Basic .NET и Visual Basic 2005 Windows, используемый для подключения к именованному каналу сервера, выполните следующие действия.
  1. Запустите Microsoft Visual Studio .NET или Microsoft Visual Studio 2005.
  2. В меню Файл выберите команду Создать, а затем — пункт Проект
  3. В области Типы проектоввыберите Проекты Visual Basicи в списке Шаблонывыберите Приложение Windows .

    Примечание В Visual Studio 2005 выберите в списке Типы проектовVisual Basic .
  4. В поле имя введите MyClientApp, а затем нажмите кнопку ОК. По умолчанию создается форма с именем Form1.
  5. Добавьте элемент управления Button на форму Form1.
  6. Щелкните правой кнопкой мыши кнопки Button1и выберите команду Свойства.
  7. Свойство Text используется для подключения к серверу.
  8. Добавьте элемент управления Label в форму Form1. Элемент управления Label1 подпись добавляется в форму Form1 .
  9. Значение Falseсвойства Visible элемента управления Label1 метки .
  10. Добавьте в форму Form1 два элемента управления TextBox .

Написание кода для подключения к серверу именованного канала

Подключение к серверу именованного канала с помощью функции CallNamedPipe . После подключения к серверу, CallNamedPipe функция записывает в канал чтение из канала и затем закрывает канал. Чтобы подключиться к серверу и прочитать или записать данные, выполните следующие действия:
  1. В режиме конструктора дважды щелкните подключиться к серверуи добавьте следующий код к процедуре Button1_Click :
    Dim i, res, cbRead,numBytes As Integer
    Dim 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. Добавьте следующий код перед процедуре 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. В меню Построение выберите команду Построить решение.

Убедитесь, что код работает

Чтобы убедиться, что код работает, выполните следующие действия.
  1. Чтобы запустить приложение-сервер, нажмите кнопку Пуск , в меню Отладка проекта MyServerApp.
  2. В форме Form1 нажмите кнопку Создать именованный канали нажмите кнопку отложить для клиентских подключений. Приложение заблокирована и ожидает подключения клиента.
  3. Чтобы запустить клиентское приложение, нажмите кнопку Пуск , в меню Отладка проекта MyClientApp.
  4. Введите в форму Form1 10 в TextBox1 , а затем щелкните подключиться к серверу. Массив байтов, полученных в поле TextBox2 видно.
  5. Чтобы отключиться от сервера клиентского приложения, введите 0 поле TextBox1 в клиентское приложение и выберите команду подключиться к серверу.
  6. Закройте клиентское приложение.
  7. Чтобы отключить стороны сервера именованного канала, а затем закройте приложение-сервер, нажмите кнопку Отключить сервер на форму Form1 серверного приложения.

Ссылки

Для получения дополнительных сведений посетите следующие веб-сайты Microsoft Developer Network (MSDN):
Именованные каналы
http://msdn2.Microsoft.com/en-us/library/aa365590.aspx
Проводки по именованным каналам
http://msdn2.Microsoft.com/en-us/library/aa365789.aspx
Функции канала
http://msdn2.Microsoft.com/en-us/library/aa365781.aspx

Свойства

Код статьи: 871044 - Последний отзыв: 23 ноября 2013 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Ключевые слова: 
kbvs2005swept kbvs2005applies kbserver kbpipes kbipc kbclient kbhowtomaster kbhowto kbmt KB871044 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 871044

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com