Winsock
Автор (С) Андрей Колесов, Ольга Павлова   
30.07.2001 г.
Элемент управления Winsock, невидимый для пользователя, обеспечивает доступ к сетевым протоколам TCP (Transfer Control Protocol) и UDP (User Datagram Protocol). Его можно помещать на пользовательские формы Microsoft Excel, Word и PowerPoint и встроенные формы Microsoft Access, а также использовать в Visual Basic, Visual C++ и Visual FoxPro. С Winsock перестает быть проблемой установление связи и организация двунаправленного обмена данными с удаленной машиной; он позволяет создавать приложения типа "клиент--сервер", не вникая в детали устройства TCP и низкоуровневых функций API, обеспечивающих работу с сетевыми протоколами.
Публикуется с разрешения авторов.
(С) Андрей Колесов, Ольга Павлова
Вперые опубликовано в электронной версии журнала "Мир ПК" N 3/99

Элемент управления Winsock, невидимый для пользователя, обеспечивает доступ к сетевым протоколам TCP (Transfer Control Protocol) и UDP (User Datagram Protocol). Его можно помещать на пользовательские формы Microsoft Excel, Word и PowerPoint и встроенные формы Microsoft Access, а также использовать в Visual Basic, Visual C++ и Visual FoxPro. С Winsock перестает быть проблемой установление связи и организация двунаправленного обмена данными с удаленной машиной; он позволяет создавать приложения типа "клиент--сервер", не вникая в детали устройства TCP и низкоуровневых функций API, обеспечивающих работу с сетевыми протоколами.

Некоторые варианты использования

  • создание клиентской программы, собирающей информацию от пользователей для отправки на центральный сервер;
  • создание серверной программы, которая будет собирать в едином центре данные от разных пользователей;
  • создание "разговорной" программы (для обмена информацией по работе).

Выбор протокола

Приступая к работе с Winsock, в первую очередь необходимо сначала решить, какой протокол будет использоваться - TCP или UDP. Основное отличие между ними заключается в том, что TCP - это протокол на базе связи, т. е. он требует сначала установить связь и лишь после этого переходить к обмену данными, а UDP представляет собой протокол без связи и позволяет отправить сообщение с одного компьютера на другой, не выполняя предварительно никаких специальных действий. Кроме того, при использовании UDP максимальный объем данных, передаваемых за один раз, определяется самой сетью.

Обычно тип протокола однозначно определяется характером создаваемой программы. Вот несколько критериев, на основе которых можно сделать выбор.

  • TCP удобно использовать, если программа должна требовать подтверждения от сервера (клиента) при отправлении или получении данных. Таким подтверждением может служить сигнал о том, что связь успешно установлена, который при работе с TCP обеспечивается автоматически.
  • TCP предпочтительнее при большом объеме пересылаемых данных (например, если это изображения или оцифрованный звук), поскольку он поддерживает установленную связь и контролирует целостность передаваемой информации. Однако он требовательнее к ресурсам компьютера, чем UDP.
  • UDP хорошо подходит для передачи небольших объемов информации - например, для рассылки уведомлений компьютерам о выполнении определенных задач.

Основные сведения о TCP

Протокол TCP позволяет установить и поддерживать связь с удаленным компьютером, а когда связь установлена, организовать обмен данными.

Программа, работающая по протоколу TCP, действует по-разному в зависимости от того, чем она является - клиентом или сервером. Клиент выдает запрос на связь, а сервер принимает его и завершает установление связи. После этого они могут свободно обмениваться данными в обе стороны.

Для программы-клиента необходимо определить имя или IP-адрес сервера (свойство RemoteHost), а также порт, на котором сервер будет ее "слушать" (свойство RemotePort). После того как они заданы, можно послать серверу запрос на установление связи, вызвав метод Connect.

Для программы-сервера следует определить порт, на котором она будет "слушать" клиентов (свойство LocalPort), после чего вызвать метод Listen. При получении запроса на установление связи от клиентской машины произойдет событие ConnectionRequest. Чтобы завершить процедуру установления связи, необходимо обработать это событие, вызвав метод Accept.

Когда связь установлена, можно отправлять данные, используя метод SendData. При получении данных происходит событие DataArrival. Его обработка должна состоять в вызове метода GetData.

Основные сведения об UDP

Протокол UDP не предусматривает отдельной процедуры установления связи и позволяет использовать и одну и ту же программу в качестве как клиента, так и сервера.

Для работы по протоколу UDP необходимо задать для клиента свойство LocalPort, а для сервера - свойства RemoteHost (Internet-адрес клиентской машины) и RemotePort (тот же номер порта, который задан в качестве LocalPort компьютера-клиента). Отправка и получение данных происходят так же, как при использовании протокола TCP: для отправки применяется метод SendData, при получении сообщения возникает событие DataArrival, обработка которого должна состоять в вызове метода GetData.

Задание протокола

Протокол, который будет использовать программа, определяется свойством Protocol. Значение sckTCPProtocol соответствует протоколу TCP, а значение sckUDPProtocol - протоколу UDP. Нужное значение можно задать как в окне свойств Winsock, так и вручную, с помощью оператора

Winsock1.Protocol = sckTCPProtocol  

Определение имени компьютера

Чтобы связаться с удаленным компьютером, нужно указать его IP-адрес или имя. Поскольку IP-адрес труден для запоминания (это четыре трехзначных числа, разделенных точками), чаще пользуются именем компьютера. Его вы найдете в поле Computer name ("Имя компьютера") на странице Identification ("Компьютер") окна свойств сети. Чтобы открыть это окно, нужно выбрать значок Network ("Сеть") на Панели управления или пункт Properties ("Свойства") контекстного меню, которое появляется при щелчке правой кнопкой мыши по значку Network Environment ("Сетевое окружение") на Рабочем столе Windows.

Пример использования Winsock

Ниже мы продемонстрируем использование Winsock при создании TCP-клиента и TCP-сервера, построив два отдельных приложения, которые будут запускаться на разных машинах. Чтобы пример работал, на обеих машинах должен присутствовать Winsock. Там, где его нет, следует предварительно установить в VB связь с файлом Mswinsck.ocx. После этого как для клиента, так и для сервера необходимо добавить к пользовательской форме элемент Microsoft WinSock Control, version 5.0, но дальнейшие действия для клиента и сервера различны.

Настройка TCP-сервера

  1. Поместите на ту же форму, где находится Winsock, два элемента управления TextBox ("Поле").
  2. Установите значения свойств для формы и элементов управления так, как показано в таблице:
    Объект Свойство Значение
    UserForm Name usfServer
    UserForm Caption TCP-сервер
    Winsock Name tcpServer
    TextBox1 Name txtSendData
    TextBox2 Name txtOutput
  3. В окне кода введите следующий текст:
    Option Explicit    Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)      ' Проверка, установлено ли значение свойства State      ' элемента управления как Closed. Если нет, закрывает связь      ' перед тем, как принять новую связь      If tcpServer.State <> sckClosed Then tcpServer.Close      ' Принимает запрос с параметром requestID      tcpServer.Accept requestID  End Sub    Private Sub txtSendData_Change()      ' Элемент управления TextBox, называемый txtSendData,      ' содержит данные, которые надо отправить. Когда      ' пользователь пишет что-либо в поле ввода, строка      ' отправляется с помощью метода SendData      tcpServer.SendData txtSendData.Text  End Sub    Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)      ' Объявление переменной для поступающих данных.      ' Использует метод GetData и устанавливает свойство Text      ' элемента управления TextBox, называемого txtOutput,      ' как данные      Dim strData As String      tcpServer.GetData strData      ' В Microsoft Access подставьте txtOutput.Value вместо      ' txtOutput.Text в следующей строке      txtOutput.Text = strData  End Sub    Private Sub UserForm_Initialize()      ' Устанавливает свойство LocalPort как целое число, а      ' затем активизирует метод Listen      Server.LocalPort = 1001      tcpServer.Listen  End Sub    

Настройка TCP-клиента

  1. Поместите на ту же форму, где находится Winsock, элемент управления CommandButton ("Кнопка") и два элемента TextBox ("Поле").
  2. Установите значения свойств для формы и элементов управления так, как показано в таблице:
    Объект Свойство Значение
    UserForm Name usfClient
    UserForm Caption TCP-клиент
    CommandButton Name cmdConnect
    CommandButton Caption Связь
    TextBox1 Name txtSendData
    TextBox2 Name txtOutput
  3. Задайте значение свойства RemoteHost в соответствии с именем того компьютера, на котором будет запущен сервер.
  4. В окне кода введите следующий текст:
    Option Explicit    Private Sub UserForm_Initialize()      ' Имя элемента управления Winsock - tcpClient.      ' Чтобы задать удаленный компьютер, можно      ' использовать либо IP-адрес (например, "121.111.1.1"), либо      ' "дружественное" имя компьютера, как здесь      tcpClient.RemoteHost = "your server machine"      tcpClient.RemotePort = 1001  End Sub    Private Sub cmdConnect_Click()      ' Активизация метода Connect, чтобы инициировать связь      tcpClient.Connect  End Sub    Private Sub txtSendData_Change()      tcpClient.SendData txtSendData.Text  End Sub    Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)      Dim strData As String      tcpClient.GetData strData      txtOutput.Text = strData  End Sub  

Запуск примера

Скопируйте либо клиентскую, либо серверную часть программы на другой компьютер, после чего запустите клиентскую часть на одном компьютере, а серверную - на другом. Нажмите кнопку "Связь" на клиентской форме. Теперь при вводе какого-либо текста в поле txtSendData на любой из форм он должен появиться в поле txtOutput на другой форме.


Окно TCP-сервера


Окно TCP-клиента


Просмотров: 13610

  Ваш коментарий будет первым

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code