Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование в сетях Windows

.pdf
Скачиваний:
538
Добавлен:
11.03.2015
Размер:
3.02 Mб
Скачать

478

ЧАСТЬ II Интерфейс прикладного программирования Winsock

Последние две подпроцедуры, связанные с приемом UDP-сообщений — cmdCloseListen_Click и sockRecv_Etror. Обработчик cmdCloseListenClick срабатывает при щелчке кнопки Close Listen. Процедура лишь вызывает метод Close для элемента управления Winsock. При закрытии UDP-элемента управления освобождается базовый описатель сокета. Событие sockRecv_Error вызывается при любой ошибке Winsock. Как уже упоминалось, из-за неустойчивой природы будет генерироваться мало ошибок UDP.

ПолучениеинформацииотэлементаWinsock

Последняя часть рассматриваемого примера — рамка группы Winsock Information. Заголовки меток, содержащих локальное имя и локальный IP-адрес задаются в момент загрузки формы. После загрузки формы и создания экземпляров элементов управления Winsock свойствам LocalHostName и LocallP назначают значения, соответствующие имени и IP-адресу компьютера. Эти значения можно считать в любое время.

Следующие две надписи — Sender State и Receiver State, отображают состояние двух используемых приложением элементов управления Winsock. Сведения о состоянии обновляются два раза в секунду. Здесь в работу включается элемент управления Timer: каждые 500 миллисекунд он вызывает обработчик Timer, который запрашивает о состоянии сокетов и обновляет надписи. Мы выводим сведения о состоянии сокетов для информации. Значения последних двух меток — Remote IP и Remote Port, задают при получении UDP-сообщения.

Запуск UDP-приложения

Теперь рассмотрим UDP-приложение в работе. Лучший способ протестировать его — запустить экземпляр приложения на трех отдельных компьютерах. В одном из приложений щелкните кнопку Listen, а в двух других — введите в поле Recipient's Name/IP имя или IP-адрес компьютера, на котором выполняется первый экземпляр. Теперь несколько раз щелкните кнопку Send Datagram — в соответствующем окне принимающего приложения должны отобразиться сообщения. При приеме каждого сообщения поля группы Winsock Information обновляются и им задаются значения, соответствующие IPадресу отправителя и номеру порта, через который было передано сообщение. Вы можете воспользоваться командами элемента управления Sender этого же экземпляра приложения, чтобы принимать сообщения на том же компьютере.

Еще один интересный тест — широковещательная рассылка по определенной подсети или рассылка широковещательных дейтаграмм. После того как вы отошлете дейтаграмму в определенную подсеть, сообщение получат все прослушивающие приложения (при условии, что все три компьютера тестируются в одной подсети).

Рассмотрим пример: среди тестовых компьютеров имеется две системы с одним сетевым адаптером, их IP-адреса — 157.54.185.186 и 157.54.185.224. На третьем компьютере установлено несколько сетевых адаптеров; 1Р-адре-

ГЛАВА 15 Элемент управления Winsock

479

са этой системы — 169-254.26.113 и 157.54.185-206. Как видите, все три системы принадлежат к одной подсети — 157.54.185.255.

Давайте на секунду отвлечемся и обсудим одну важную деталь. Для получения UDP-сообщений требуется при вызове метода Bind явно связать элемент управления с первым IP-адресом, хранящимся в сетевых привязках. Этого достаточно, если в системе установлен лишь один сетевой адаптер. Ну, а если на компьютере несколько сетевых интерфейсов, и следовательно, несколько IP-адресов? В таком случае второй параметр, передаваемый методу Bind, — IP-адрес, с которым связан элемент управления Winsock. К сожалению, свойство элемента управления Winsock возвращает лишь один IPадрес, методов, позволяющих получить остальные IP-адреса локального компьютера, не существует.

Теперь попробуем осуществить широковещательную рассылку. Закройте все передающие и прослушивающие сокеты во всех запущенных экземплярах приложения. На компьютере с одним сетевым адаптером щелкните кнопку Listen, чтобы каждая система могла получать сообщения дейтаграмм. Компьютер с несколькими сетевыми адаптерами не используется, поскольку в коде элементы управления не связываются с каким-либо конкретным IP-ад- ресом. На третьем компьютере введите адрес получателя — 157.54.185.255, и несколько раз щелкните кнопку Send Data. Вы увидите, что сообщение принимают оба приложения.

Вам, возможно, будет интересно, как система выбирает интерфейс для передачи дейтаграммы, если на передающем компьютере установлено несколько сетевых адаптеров. Одна из функций таблицы маршрутизации — определить оптимальный интерфейс для передачи сообщения при наличии конечного адреса и адрес сетевых адаптеров, установленных на локальном компьютере1.

Последний тест таков: закройте передающий сокет на третьем компьютере, задайте адрес получателя как 255.255.255.255 и несколько раз щелкните кнопку Send Datagram. Результаты должны быть одинаковыми: два других прослушивающих приложения получат сообщение. На компьютере с несколькими сетевыми адаптерами будет наблюдаться единственное отличие — UDP-сообщение рассылается по всем сетям, с которыми он соединен.

Состояние UDP-сокетов

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

Подробностиоподсетяхимаршрутизациисм.влитературе,посвященнойпакетупротоко- ловTCP/IP:например,вкнигеРичардаСтивенса«TCP/IPIllustratedVolumeI•>(Addison-Wesley.

1994), или доктора Сидни Фейт «TCP/IP Architecture, Protocols, and Implementation with IP v6 and IP Security» (McGraw-Hill. 1996).

480

ЧАСТЬ II Интерфейс прикладного программирования Winsock

ний. Обратите внимание, что начальное состояние по умолчанию — sckClosed, и при указании неверного имени компьютера не генерируется ошибок.

Accept

SendData

GetOata

Bind

PeekData

Connect

Listen

 

SendData

 

GetOata

 

PeekOata

 

t

 

Accept Close

 

Connect

 

Listen

 

SendData

 

GetData

 

PeekData •«.

 

Рис.15-2.ДиаграммасостоянийUDP-сокета

 

Пример (TCP-приложение)

Использование элемента управления Winsock с протоколом TCP несколько сложнее, но более распространено, чем с протоколом UDP. Как и в случае UDP, мы рассмотрим пример ТСР-приложения и подробно изучим его код, чтобы понять этапы, необходимые для успешного установления ТСР-соеди- нения. На рис. 15-3 изображено запущенное приложение.

186Amesagefromthelocamachine'

 

 

 

 

15754185224Anothermesage

 

 

 

 

!$«**. <.„,•

 

J.DM.

 

15754185206Tb»onewassentfromamuKihomedmachine

 

 

jLocalCbent

sckConnected

2560

 

 

1LocalServer

sckListemng

5150

 

115754185206

sckConnected

1076

 

15754185224

sckConnected

1113

 

115754185186

sckConnected

2560

21-

Рис.15-3.ПримерTCP-приложения

ГЛАВА 15 Элемент управления Winsock

481

* В форме на рис. 15-3 три группы флажков: TCP Server, TCP Client и Winsock Information. Сначала рассмотрим область TCP Server. У сервера есть текстовое поле — txtServerPort, для локального порта, к которому сервер будет привязан для прослушивания входящих соединений клиентов. Кроме того на форме имеются две кнопки: одна — для перевода сервера в режим прослушивания и вторая — для остановки и прекращения приема входящих соединений. Наконец, на рисунке показан единственный элемент Winsock — sockServer. Если вы взглянете на страницу его свойств, то увидите, что свойство Index равно 0 Это значит, что данный элемент фактически является массивом, где может содержаться несколько экземпляров элемента Winsock Значение 0 указывает, что во время загрузки формы будет создан только один экземпляр (нулевой элемент массива). В любое время можно динамически загрузить еще один экземпляр элемента Winsock в массив этого элемента.

Массив элементов Winsock — основа серверных возможностей Помните, что с одним элементом Winsock связан лишь один описатель сокета. В главе 7 упоминалось, что когда сервер принимает входящее соединение, для работы с этим соединением создается новый сокет. Наше приложение сконструировано для динамической загрузки элементов Winsock в ответ на запрос о соединении от клиента, поэтому соединение можно передать вновь загруженному элементу, не прерывая его обработки сокетом на сервере.

Другой способ — создать х элементов Winsock еще на этапе проектирования. Впрочем, это решение требует значительных ресурсов и плохо масштабируется. При старте приложения потребуется много времени, чтобы загрузить все необходимые ресурсы для каждого элемента; кроме того, не всегда ясно, сколько элементов необходимо. Разместив х элементов, вы жестко ограничите количество одновременно обслуживаемых клиентов. Если требования вашего приложения допускают фиксирование количества одновременных соединений, проще реализовать вторую модель, а не массив. Впрочем, для большинства приложений массив элементов Winsock подойдет лучше.

В листинге 15-2 приведен код программы. Файл с кодом данного проекта Visual Basic — SockTCP.vbp, записан в папке Chapter 15 на прилагаемом

компакт-диске.

в1

Листинг 15-2. Пример ТСР-приложения

Option Explicit

 

1

Индексное значение последнего элемента управления

1

Winsock автоматически

загружается в массив sockServer

Private Serverlndex As

Long

Private Sub cmdCloseListen_Click()

Dim itemx As Object

'Закрываем прослушивающий сокет сервера. После этого клиенты

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

см.след.стр.

482

ЧАСТЬ II Интерфейс прикладного программирования Winsock

Листинг 15-2. (продолжение)

sockServer(O).Close cmdListen.Enabled = True cmdCloseListen.Enabled = False

Set itemx = lstStates.Listltems.ltem(2) itemx.SubItems(2) = "-1"

End Sub

Private Sub cmdConnect_Click()

1Заставляем клиентский элемент управления попытаться

'подключиться к заданному серверу

'по указанному номеру порта

sockClient.LocalPort = 0 sockClient.RemoteHost = txtServerName.Text sockClient.RemotePort = Clnt(txtPort.Text) sockClient.Connect

cmdConnect.Enabled = False End Sub

Private Sub cmdDisconnect_Click()

Dim itemx As Object

'Закрываем клиентское подключение и настраиваем

'командные кнопки для последующих соединений

sockClient.Close

cmdConnect.Enabled = True cmdSendData.Enabled = False

 

cmdDisconnect.Enabled = False

 

 

'

Задаем номер порта как -1, чтобы указать отсутствие соединения

.эй,

 

 

 

 

 

Set itemx =

lstStates.Listltems.Item(i)

 

 

itemx.Subltems(2) = "-1"

 

End

Sub

 

yA

Private Sub cmdExit Click()

 

 

Unload He

"

 

End

Sub

 

 

Private Sub cmdListen_Click()

 

 

Dim itemx As

Object

 

 

'

Переводим

серверный элемент управления в режим прослушивания

 

 

'

на порту с заданным номером

 

 

sockServer(O).LocalPort = Clnt(txtServerPort.Text)

 

 

sockServer(O).Listen

 

 

Set itemx =

lstStates.Listltems.Item(2)

 

 

 

 

 

 

 

 

 

 

ГЛАВА 16

Элемент управленийWinsock

 

483

Листинг 15-2.

(продолжение)

 

 

 

 

 

itemx.Subltems(2) = sockServer(0).LocalPort

Ie\

.f

 

 

cmdCloseListen.Enabled = True

 

 

 

 

 

 

cmdListen.Enabled = False

 

 

 

 

 

 

 

EndSub

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

008

 

 

Private Sub cmdSendData_Click()

 

 

 

 

 

 

'

При наличии соединения передаем указанные данные

на сервер

 

uut

If (sockClient.State

=

sckConnected) Then

 

 

 

 

 

 

sockClient.SendData

 

txtSendData.Text

 

QfA

 

 

Else

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MsgBox

"Unexpected

errorl

Connection

closed"

 

 

 

 

 

Call

cmdDisconnect_Click

 

 

 

 

 

 

End If

 

 

 

 

 

 

 

 

 

 

 

 

 

End Sub

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Private Sub Form_Load()

 

 

 

 

 

. УЛ

' *r,i1s. лей

 

Dim

itemx

As

Object

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

duS

ЬлЗ

lblLocalHostname.Caption

= sockServer(0).LocalHostName

 

 

 

lblLocalHostlP.Caption

=

sockServer(O).LocallP

 

 

 

 

'

Инициализируем свойство

Protocol со

значением

sckTCPProtocol,

 

 

'

мы будем использовать только протокол TCP

 

!'Yfi

 

 

Serverlndex

=

0

 

 

 

 

 

 

 

 

 

sockServer(O). Protocol = sckTCPProtocol

 

 

 

 

sockClient.Protocol

=

sckTCPProtocol

 

 

даясмсоа

 

 

'

Настраиваем

кнопки

 

 

 

 

 

 

 

'

cmdDisconnect. Enabled

=

False

 

W I T * «„a»n.

 

 

cmdSendData.Enabled =

False

 

*?

 

 

duS

 

cmdCloseListen.Enabled

=

False

 

 

 

 

 

'

Инициализируем элемент

управления ListView, содержащий

 

 

 

'

информацию

о текущем состоянии всех созданных элементов

 

 

 

'

управления

Winsock

(необязательно подключенных или используемых)

 

 

Set itemx = lstStates.ListItems.Add(1, , "Local Client") itemx.Subltemsd) = "sckClosed"

itemx.Subltems(2) = "-1"

Set itemx = lstStates.ListItems.Add(2, , "Local Server") itemx.Subltems(1) = "sckClosed"

itemx.Subltems(2) = "-1"

' Инициализируем таймер, который управляет скоростью ' обновления информации об упоминавшихся выше состояниях сокетов

си.след.стр.

484

ЧАСТЬ II

Интерфейс прикл |да>Г»1№Щ»ИИЦ10ванияМп«оок

 

 

 

 

 

 

Листинг 15-2. (продолжение)

(щ,

щ

,£.ЗГ

 

TimeM.Interval

=

500

io4feDOJ.(*)tevi

 

П е в д Ш и *

 

Timeri.Enabled

=

True

 

 

 

 

End Sub

 

 

 

soi""

ьШ

Private Sub sockClient_Close()

 

 

 

 

 

sockClient. Close

 

 

 

 

 

End Sub

 

 

|д f

 

 

 

 

Private Sub sockClient_Connect()

Dim itemx As Object

' Соединение было успешным, активируем кнопки передачи данных

cmdSendData.Enabled = True cmdDisconnect.Enabled = True

Set itemx = lstStates.Listltems.Item(i) itemx.Subltems(2) = sockClient.LocalPort

End Sub

Private Sub sockClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, _ ByVal Source As String, ByVal HelpFile As String, _

ByVal HelpContext As Long, CancelDisplay As Boolean)

'У элемента управления Client произошла ошибка: выводим

'сообщение и закрываем элемент управления. Ошибка переводит

 

'

элемент управления в

состояние sckError;

переход в другое состояние

 

'

возможен после вызова

метода

Close.

 

 

 

MsgBox Description

 

 

 

 

 

sockClient.Close

 

 

 

 

 

cmdConnect.Enabled = True

 

 

 

End

Sub

 

 

 

 

 

 

Private Sub sockServer_Close(index As Integer)

 

 

 

Dim

itemx

As Object

 

 

 

 

 

1

Закрываем данный элемент управления Winsock

,j_

 

sockServer(index).Close

 

 

 

aej

 

Set itemx = lstStates.Listltems.ltem(index + 2)

 

 

lstStates.Listltems.ltem(index + 2).Text = "-.-.-.-"

 

 

itemx.Subltems(2) = "-1"

 

 

 

End

Sub

 

 

 

 

 

 

Private

Sub sockServer_ConnectlonRequest(lndex As Integer, _

 

 

 

 

ByVal

requestID As

Long)

 

 

 

 

Dim

i As

Long, place As

Long,

freeSock As

Long, itemx As

Object

ГЛАВА 15 Элемент управления Wmsock

485

Листинг 15-2. {продолжение)

'

Просматриваем массив и ищем закрытый элемент управления,

 

1

который можно

повторно использовать

 

 

freeSock = О

 

 

 

 

For

i =

1 То Serverlndex

 

 

 

 

 

If sockServer(i).State = sckClosed Then

 

 

 

 

freeSock

= l

 

 

j&

 

 

 

Exit For

 

 

 

due

 

 

EndIf

 

 

 

 

 

 

 

 

 

Next

l

 

 

 

 

 

'

Если

значение

freeSock по-прежнему

равно 0, свободные

элементы [

'

управления отсутствутют,

и поэтому

мы загружаем

£

1

новый

элемент управления

Winsock

 

-

If freeSock = 0

Then

 

 

 

 

 

Serverlndex

= Serverlndex + 1

 

чмв(\»всгу

 

 

Load

sockServer(Serverlndex)

 

 

 

 

 

 

sockServer(Serverlndex).Accept requestID

 

«eC

 

place = Serverlndex

 

 

 

 

Else

 

 

 

 

 

 

sockServer(freeSock).Accept

requestID

 

 

 

 

place = freeSock

 

 

 

.IT

EndIf

 

 

 

J I

'

Если не было обнаружено свободных элементов управления,

'

выше мы добавляем дополнительный элемент.

Создайте

'

в элементе управления ListView запись

для

нового

элемента

'

управления. В любом случае

установите

состояние

нового

'соединения как sckConnected.

If freeSock = 0 Then

Set itemx = lstStates.ListItems.Add(, , sockServer(Serverlndex).RemoteHostlP)

Else

Set itemx = lstStates.ListItems.Item(freeSock + 2) lstStates.ListItems.Item(freeSock + 2).Text = _

sockServer(freeSock).RemoteHostIP

EndIf

itemx.Subltems(2) = sockServer(place).RemotePort

due bnd

Ю

End Sub

Private Sub sockServer_DataArrival(mdex As Integer, ByVal bytesTotal As Long)

Dim data As String, entry As String

' Выделяем строковый буфер достаточного размера и получаем данные

см след стр

486 ЧАСТЬ II Интерфейс прикладного программирования Winsock

Листинг 15-2.

{продолжение)

 

 

 

 

 

 

 

 

 

<'*«'

data = String(bytesTotal + 2,

 

Chr$(0))

 

 

 

 

 

 

 

 

 

sockServer(index).GetData

data,

vbString, bytesTotileN0>-'eM

**fcG»«!rw«ooqn

1

Добавляем

IP-адрес

клиента

в

начало сообщения

оичогшоН

<<нжои

йш}ото»

'

и помещаем сообщение в список

 

 

 

 

 

0

? Яз<3ав'1

 

 

 

 

 

 

 

 

 

 

 

XebflIi8V4«8 ОТ

t

»

t ifi

entry = sockServer(index).RemoteHostIP &

": "

&

йШР-ИР^чШа™

tl

lstMessages.Addltem

entry

 

 

 

 

 

 

I

*

Jte

 

*

^

End Sub

 

 

 

 

 

 

 

 

 

 

K '

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

", ел

 

Private Sub sockServer_Error(index As Integer,

_

 

 

 

 

 

 

I

 

ByVal

Number As

Integer,

Description

As

String,

_

 

 

 

 

 

ByVal

Scode As

Long,

ByVal

Source As

String,

_

 

 

 

 

 

 

 

ByVal

HelpFile

As String,

 

ByVal HelpContext

As

Long,

_

 

 

-

»«8вм

 

CancelDisplay

As

Boolean)

 

 

 

 

 

 

 

 

 

 

'

Выводим

сообщение

об ошибке

и закрываем

указанный элемент

Аоо&тчЧ

'управления. Ошибка переводит элемент управления в состояниеifi

'sckError, которое снимается лишь после вызова метода Close. Ьое

MsgBox Description

 

 

 

 

 

 

 

 

'

sockServer(index).Close

 

 

 

 

 

 

 

»'

saetq

End Sub

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

Private Sub Timer1_Timer()

 

 

 

 

 

 

 

 

 

Dim

i As

Long, index As Long,

itemx As

Object

 

 

 

 

bf?3

 

 

 

 

 

 

 

 

 

 

 

3 '

 

'

Задаем

состояние локального

элемента

управления

Winsock клиента

 

 

 

 

 

 

 

 

 

 

 

 

а '

 

Set

itemx

=

lstStates.Listltems.Item(i)

 

 

 

 

 

4

Select Case

sockClient.State

 

 

 

 

 

 

>oo

 

Case

sckClosed

 

 

 

 

 

 

 

 

 

 

itemx.Subltems(i)

=

"sckClosed"

 

 

 

»'«**т <*

'»••">*

U

 

Case

sckOpen

 

 

 

 

»5

ee)a?2JaI

, je8

 

itemx.Subltemsd)

=

"sckOpen"

•"

 

levied

lev1*

ч

 

 

Case

sckListening

 

 

 

 

 

 

 

 

 

 

itemx.Subltems(1)

=

"sckListening"

 

•»?*/??ei

*•

/ Je8

 

 

Case

sckConnectionPending

 

r1r

(»»I*JIJ9I.

'Stel

 

 

itemx.Subltems(1)

=

"sckConnectionPending"

"itjiev

•»

 

 

 

Case

sckResolvingHost

 

 

 

 

 

 

 

 

tl

 

itemx. Subltems(1)

=

"sckResolvingHost"

 

e e <£)«t«iejJd«3.xt»s3f

 

 

Case

sckHostResolved

 

 

 

 

 

 

 

 

 

 

itemx.Subltemsd)

=

"sckHostResolved"

 

 

 

 

ЙУЗ bn-

 

Case

sckConnecting

 

 

 

 

 

 

 

 

 

 

itemx.Subltems(1)

=

"sckConnecting"

 

ftO.iwn

t <J«8 eJeviTl

 

Case

sckConnected

 

 

 

 

 

 

»" 1'

 

'л\'

 

itemx. Subltemsd)

=

"sckConnected"

 

lf!

 

' 1

 

Case

sckClosing

 

 

 

 

 

 

 

 

 

 

itemx.Subltems(1)

=

"sckClosing"

 

 

 

>f"

 

 

Case

sckError

 

 

 

 

 

 

 

 

 

 

itemx.Subltemsd) = "sckError"

 

 

 

 

 

 

 

 

 

 

 

ГЛАВА 15 Элемент управления Winsock

487

Листинг 15-2.

(продолжение)

 

 

 

 

Case Else

 

 

 

 

 

 

 

itemx.Subltems(i) = "unknown: " & sockClient.State

 

End Select

 

 

 

 

 

 

Теперь

задаем

состояния прослушивающего серверного элемента

 

'

управления, а также элементов

управления всех подсоединенных

 

1

клиентов

 

 

 

 

 

index =

О

 

 

 

 

 

For i = 2 To Serverlndex + 2

 

 

 

Set

itemx

=

lstStates.Listltems.Item(i)

 

 

 

 

 

 

 

 

Г

Select Case

sockServer(index).State

 

 

 

 

 

Case

sckClosed

 

 

 

 

 

ltemx.Subltems(i)

=

"sckClosed"

 

 

 

Case

sckOpen

 

 

 

 

 

ltemx.Subltems(i) =

"sckOpen"

 

 

 

Case

sckListening

 

 

 

 

 

ltemx.Subltems(i)

=

"sckListening"

 

 

 

Case

sckConnectionPending

 

 

 

itemx.Subltemsd) =

"sckConnectionPending"

 

 

 

Case

sckResolvingHost

 

 

 

 

 

itemx.Subltems(1)

=

"sckResolvingHost"

 

 

 

Case

sckHostResolved

 

 

 

 

 

itemx.Subltemsd) = "sckHostResolved"

 

 

 

Case

sckConnecting

 

 

 

 

 

itemx.Subltems(1)

=

"sckConnecting"

 

 

 

Case

sckConnected

 

 

 

 

 

itemx.Subltems(1)

=

"sckConnected"

 

 

 

Case

sckClosing

 

 

 

 

 

itemx.Subltems(1)

=

"sckClosing"

 

 

 

Case

sckError

 

 

 

 

 

itemx.Subltemsd) = "sckError"

 

 

 

Case

Else

 

 

 

 

 

itemx.Subltemsd) = "unknown"

 

 

End

Select

 

 

 

 

 

index = index + 1

 

 

 

Next i

 

 

 

 

 

 

End Sub

 

 

 

 

 

 

ТСР-сервер

Рассмотрим код формы. Обратите внимание на процедуру Form Load из листинга 15-2. Два первых параметра лишь присваивают надписям значения, соответствующие имени и IP-адресу локального компьютера. Эти надписи находятся в рамке группы Winsock Information, которая служит тем же целям, что и информационная группа из примера с UDP. Далее серверный элемент управления sockServer инициализируется с параметром sckTCPProtocol. Нулевой элемент массива элементов управления Winsock всегда является