Підручник visual basic - використання winsock контрола

Використання Winsock контрола

Цей текст є вільним перекладом з MSDN і демонструє можливості обміну даними по мережі за допомогою компонента Winsock.

Дещо доповнено і виправлено одна помилка з семпли MSDN через яку передача йшла тільки в одну сторону.

Використання компонента Winsock

Компонент WinSock дозволяє з'єднатися з віддаленою машиною і обмінятися з нею даними, використовуючи UDP (User Datagram Protocol) або TCP (Transmission Control Protocol). Обидва протоколу можуть бути використані при створенні клієнт-серверних додатків. Також, як і Timer control, WinSock control є невидимим під час виконання програми.

Як ним користуватися?

- Створено додаток-клієнт, який буде збирати інформацію, перш ніж надсилати її на центральний сервер;

- Створено додаток-сервер, яке буде виконувати роль збирача і хранителя інформації від різних клієнтських додатків;

Вибір протоколу.

Коли планується використання а WinSock, необхідно вирішити який протокол буде використовуватися - TCP або UDP. Основна відмінність між ними полягає в способі організації зв'язку:

З'єднання засноване на UDP протоколі, схоже на передачу голосом, повідомлення передається від одного комп'ютера до іншого, але не ясно, чи чують вони один одного. До того ж, максимальний розмір зраджувати даних встановлюється мережею.

Можливості програми яке Ви створюєте буде залежати від протоколу, який Ви оберете. Ось кілька питань які можуть допомогти Вам вибрати відповідний протокол: Чи буде додаток вимагати повідомлення від сервера або клієнта, коли дані передаються або виходять?

Якщо буде, то TCP протокол вимагає встановленого з'єднання між передавачем і приймачем даних.

Чи будуть передані дані досить важкими (наприклад зображення або звукові файли)? Якщо з'єднання було встановлено, TCP протокол буде його підтримувати і гарантується цілісність переданих даних. Таке з'єднання, через потребу в більшій кількості обчислювальних ресурсів, може зробити його більш повільним.

Чи будуть дані передаватися порціями або за одну сесію? Наприклад, якщо Ви створюєте додаток, яке повідомляє якимось комп'ютерів, про те, що якісь завдання вже виконані, то UDP протокол більш підходящий. UDP протокол також блучше підходить для передачі невеликої кількості даних.

Встановлення політики.

Щоб встановити протокол, який буде використовувати ваше додаток Ви повинні в дизайн-таймі у вікні властивостей вибрати властивість Protocol і встановити його sckTCPProtocol або sckUDPProtocol. Це можна також зробити програмно:

Визначення імені комп'ютера.

Основи TCP з'єднання.

Коли створюється додаток, яке використовує TCP протокол перше, що Ви повинні вирішити, це ніж буде ваше додаток клієнтом або сервером. Якщо Ви створюєте додаток-сервер, значить ваш додаток буде слухати вказаний порт. Коли додаток-клієнт подасть запит на соедіеніе, додаток-сервер може прийняти запит і таким чином встановити соедіенеіе. Якщо з'єднання встановлено, додаток-клієнт і додаток сервер можуть вільно обмінюватися даними.

Наступні кроки дозволять Вам створити елементарне додаток-сервер:

Для створення TCP сервера

  • Створіть новий Standard EXE проект.
  • Замініть ім'я форми за замовчуванням на frmServer.
  • У властивості форми caption наберіть "TCP Server"
  • У меню Project \ Components додайте Microsoft Winsock Conrol 6.0
  • Перетягніть іконку компонента Winsock з панелі інструментів і розмістіть її на формі; змініть ім'я компонента на tcpServer.

Додайте на форму два Текстбокс елемента. У властивості Name першого текстового поля наберіть txtSendData, а другого txtOutput.

Додайте в форму наступний код:

Описані вище дії, виконані Вами, приведуть до створення простого додатка-сервера. Але для того щоб повністю виконати завдання, необхідно створити ще й додаток-клієнт.

Для створення TCP програми-клієнта

Додайте нову форму в проект і назвіть її frmClient. І Редагувати властивість форми caption на "TCP Client".

Перетягніть і розмістіть компонент Winsock на форму і змініть його властивість name на "tcpClient".
  • Додайте два Текстбокс-контрола на форму frmClient.
  • Ім'я першого встановіть txtSend, а другого txtOutput.
  • Перетягніть на форму CommandButton і встановіть його властивість name в "cmdConnect".
  • Змініть властивість caption цієї кнопки на "Connect".

Додайте наступний код в форму.

Збережіть проект в окремій директорії.

Якщо Ви хочете, спробувати, як додатки будуть здійснювати зв'язок між двома комп'ютерами, то Вам доведеться провести наступні дії:
  • Видалити з коду форми додатка-сервера рядок frmClient.Show.
  • У вікні Project Explorer клацнути правою кнопкою миші на формі frmClient.frm і в меню вибрати Remove frmClient.frm після чого зберегти проект під ім'ям Server1.
  • Відкрити перший варіант проекту і таким же чином видалити з проекту вже форму frmServer.frm.
  • Створити exe модуль для frmClient-а і переписати його на віддалений комп'ютер і запустити його там.

Примітка: якщо на віддаленому комп'ютері не встановлено VB будьте готові до того, що вам буде потрібно переписати на нього з WINDOWS \ SYSTEM \ mswinsck.ocx і зареєструвати його за допомогою команди WINDOWS \ SYSTEM \ regsvr32.exe mswinsck.ocx

Якщо додаток буде вимагати якісь додаткові dll модулі перепишіть їх зі своєї машини на віддалену.
  • На своїй машині, відкрийте проект Server і запустіть його.
  • На клієнтській машині натисніть кнопку Connect і наберіть текст всередині текстового поля txtSendData на кожній формі і переконайтеся, що той же самий текст з'явиться в текстовому полі txtOutput в додатку, запущеному на іншому комп'ютері.

Обробка більш ніж одного запиту на встановлення з'єднання.

Додаток-сервер, яке ми створювали спочатку може обробити тільки один запит на з'єднання. Проте, існує можливість обробити декілька запитів на з'єднання, використовуючи той же самий керуючий елемент як один з масиву керуючих елементів.

В цьому випадку, необов'язково закривати з'єднання - просто створіть новий варіант керуючого елемента (використавши його властивість Index) і викличте метод Accept для цього нового варіанту керуючого елемента.

У наведеному нижче тексті програми, властивості Index, розміщеного на формі Winsock-компонента sckServer, присвоюється значення 0, таким чином, керуючий елемент стає частиною масиву керуючих елементів. У розділі Declarations описана локальна змінна intMax. Коли для форми відбувається подія Load, змінної intMax присвоюється значення 0 і властивості LocalPort першого елемента масиву керуючих елементів присвоюється значення 1001. Тільки після того, як викликається метод Listen цього керуючого елемента, він починає слухати вказаний порт. Коли надходить новий запит на з'єднання, здійснюється перевірка значення Index і одно воно 0 (значення елемента, який слухає порт). Таким чином, елемент який слухає порт, буде нарощувати змінну intMax і використовувати значення цієї змінної для створення нового елемента масиву. Цей новий елемент буде використовуватися для обробки запиту на з'єднання.

Основи UDP.

Створювати додатки, що використовують UDP протокол простіше, ніж створювати додатки, що використовують TCP протокол. Справа в тому, що UDP не вимагає вже встановленого з'єднання, як необхідної умови для передачі даних. У додатках використовують TCP з'єднання, один Winsock елемент повинен обов'язково "слухати" порт, в очікуванні поки яке-небудь інше додаток не стане ініціатором з'єднання, використавши метод Connect.

Оскільки обидва комп'ютера покладаються рівними у встановленні з'єднання, ми можемо назвати це з'єднання peer-to-peer. Щоб продемонструвати це з'єднання ми створимо так званий додаток-chat дозволяє двом людям спілкуватися в реальному режимі часу.

Для створення UDP з'єднання:

Створіть Standard EXE проект.
  • Змініть властивість name форми на frmPeerA.
  • Змініть властивість caption форми на "Peer A"
  • Перетягніть з панелі інструментів іконку Winsock компонента і розмістіть його на формі. Дайте властивості name значення udpPeerA.
  • Змініть властивість Protocol на UDPProtocol.
  • Додайте два текстових поля на форму.

Ім'я першої повинно бути txtSend а другий txtOutput. Додайте наведений нижче код на форму.

Щоб створити другу UDP додаток.

  • Додати стандартну форму в проект.
  • Змінити ім'я форми на frmPeerB.
  • Змінити властивість caption форми на "Peer B".
  • Перетягнути і розмістити іконку Winsock компонента на форму.
  • Змінити ім'я Winsock на udpPeerB.
  • Змінити властивість Protocol на UDPProtocol.
  • Додати два текстових поля на форму.

Ім'я першого повинно бути txtSend, а другого txtOutput.

Додайте наступний код в форму.

Щоб спробувати додаток запустіть проект, і наберіть в текстовому полі txtSend кожної форми якийсь текст.

Цей текст з'явиться в текстових полях txtOutput іншої форми.

Про метод Bind.

Як показано в наведеному вище прикладі, Ви повинні викликати метод Bind, коли створюється UDP додаток. Метод Bind резервує локальний порт для використання його елементом Winsock. Наприклад, коли Ви прив'язуєте свій елемент Winsock до порту 1001, то жодне інше додаток не може використовувати цей порт для прослуховування. Це може бути корисним, коли Ви хочете перешкодити будь-якому іншому додатку використовувати цей порт.

Метод Bind має ще один необов'язковий аргумент.

Якщо на вашому комп'ютері встановлено більше одного мережевого адаптера, аргумент LocalIP дозволить Вам точно вказати адаптер, який необхідно використовувати. Якщо Ви не вкажете цей аргумент, то Winsock компонент буде використовувати той мережевий адаптер, який розташований першим у списку, який можна подивитися в Пуск \ Налаштування \ Панель керування \ Система \ Мережеві плати.

Коли використовується UDP протокол, Ви можете змінювати властивості RemoteHost і RemotePort поки зберігається прив'язка до того ж самому LocalPort. Якби Ви використовували TCP протокол, то перш ніж змінити властивості RemoteHost і RemotePort, необхідно спочатку закрити з'єднання.