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

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

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

1 28

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

регистрировать имя службы, IP-адрес и номер порта службы при помощи функции WSASetSert'ice Клиентские приложения запрашивают информацию об этих службах при помощи комбинации API-функций WSALookupSetviceBegin, WSALookupServiceNext и WSALookupServtceEnd (см также главу 10)

Инфракрасные сокеты

Сокеты инфракрасного канала (Infrared sockets, IrSock) — новая интересная технология, впервые реализованная в Windows СЕ Они позволяют подключаться двум компьютерам по инфракрасному последовательному порту Инфракрасная связь теперь доступна в Windows 98 и в Windows 2000 Инфракрасные сокеты отличаются от традиционных тем, что учитывают непостоянство доступности переносных устройств В этой технологии применена новая модель разрешения имен

Адресация

Поскольку большинство компьютеров с устройствами инфракрасной связи (Infrared Data Association, IrDA) мобильны, традиционные схемы разрешения имен не эффективны Обычные статические ресурсы, такие как серверы имен, бесполезны, когда сетевой клиент перемещается по сети и за ее пределы Для решения этой проблемы IrSock ищет ресурсы в радиусе связи произвольным образом, не налагая нагрузки на всю сеть и не применяя стандартные функции службы имен Winsock или IP-адреса Вместо этого служба имен встроена в поток связи, а для поддержки служб, относящихся к последовательным инфракрасным портам, введено новое семейство адресов Структура адреса IrSock содержит имя службы с описанием приложения, используемого в вызовах для привязки и подключения, а также идентификатор устройства (device identifier), определяющий устройство, на котором выполняется данная служба Эта пара аналогична IP-адресу и номеру порта, используемым в обычных TCP/IP-сокетах Структура адреса IrSock такова

typedef struct sockaddr_irda {

u_short

lrdaAddressFamily,

u_char

irdaDeviceID[4],

char

irdaServiceName[25],

> SOCKADDR_IRDA,

Поле lrdaAddressFamily всегда равно AFJRDA Параметр trdaDevicelD

четырехсимвольная строка, уникально идентифицирующая устройство, на котором запущена определенная служба Это поле игнорируется при создании IrSock-сервера, но важно для клиента, поскольку указывает на IrDA-ycT- ройство, к которому он подключен (В зоне действия может быть несколько устройств ) И, наконец, поле irdaServiceName — это имя службы, которую приложение регистрирует или к которой пытается подключиться

Разрешение имен

Адресация может быть основана на селекторах (IrDA Logical Service Access Point Selector, LSAP-SEL) или на службах, зарегистрированных Information

X Л ABA 6 Семейства адресов и разрешение имен

'129

Access Services (IAS) IAS абстрагирует службу от LSAP-SEL в виде дружественного текстового имени, примерно так же, как DNS-сервер отображает имена компьютеров в цифровые IP-адреса Для успешного соединения вы можете использовать как LSAP-SEL, так и дружественное пользователю имя, но в последнем случае требуется разрешать имена Как правило, прямой LSAP-SEL- «адрес > не применяют, поскольку адресное пространство служб IrDA ограничено Реализация Win32 разрешает использовать целые идентификаторы LSAP-SEL в диапазоне 1-127 По сути, IAS-сервер можно рассматривать как WINS-сервер, поскольку он ассоциирует LSAP-SEL с текстовым именем службы

Фактически в записи IAS для нас важны лишь три поля имя класса (class name), атрибут (attribute) и значение атрибута (attribute value) Допустим, сервер хочет регистрироваться под именем службы MyServer Для этого ему нужно осуществить привязку к соответствующей структуре SOCKADDRJRDA Затем добавляется запись IAS с именем класса MyServer, атрибутом IrDATinyТР LsapSel и значением атрибута, например, 3 Это значение атрибута — следующий неиспользуемый LSAP-SEL, назначенный системой после регистрации С другой стороны, клиент передает структуру SOCKADDRJRDA вызову подключения В результате IAS начинает искать службу с именем класса MyServer и атрибутом IrDA TinyTP LsapSel Этот IAS-запрос вернет значение 3 Вы можете сформулировать свой IAS-запрос с помощью параметра IRLMP_ IAS_QUERYB вызове getsockopt

Если вы хотите полностью проигнорировать IAS (что не рекомендуется), задайте LSAP-SEL-адрес напрямую для имени сервера или конечной точки, с которой хочет соединиться клиент Обходить IAS, требуется только при подключении к устаревшим IrDA-устройствам, которые не поддерживают IASрегистрацию (например, принтерам с инфракрасным портом) Для обхода IAS-регистрации и поиска задайте имя службы в структуре SOCKADDRJRDA как LSAP-SEL-xxx, где ххх — значение атрибута в диапазоне 1-127 В итоге серверу будет явно назначен данный LSAP-SEL-адрес, а клиент, не ведя IASпоиск, сразу попытается подключиться к любой службе, выполняемой на LSAP-SEL

Нумерация lrDA-устройств

Поскольку инфракрасные (ИК) устройства появляются и исчезают из радиуса связи, необходим метод динамического перечисления соседних устройств Реализация этого механизма в Windows СЕ и в Windows 98/2000 нескольких отличается В Windows СЕ поддержка IrSock появилась раньше, чем в Windows 98 и Windows 2000, но последние в ответ на запрос нумерации возвращают дополнительную «справочную > информацию Поэтому заголовочный файл Af_irda h для Windows СЕ содержит исходные минимальные определения структур, а новые заголовочные файлы других платформ — Дополнительные определения для каждой платформы, поддерживающей rbock Для согласованности рекомендуется использовать более поздние версии заголовочного файла Af_irda h

Нумерация соседних ИК-устройств выполняется функцией getsockopt с параметром IRLMP_ENUMJDEVICES для Структура DEVICEUST передается как

1 30

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

параметр optval. Существуют две структуры, одна для Windows 98 и Windows 2000, а другая — для Windows СЕ. Они определены так:

typedef struct _WINDOWS_DEVICELIST

{

 

 

 

ULONG

numDevice;

 

WINDOWS_IRDA_DEVICE_INFO

Device[1];

}

WINDOWS.DEVICELIST, «PWINDOWS.DEVICELIST, FAR *LPWINDOWS_DEVICELIST;

typedef struct _WCE_DEVICELIST

 

{

 

 

 

ULONG

numDevice;

 

WCE_IRDA_DEVICE_INFO

Device[1];

}

WCE_DEVICELIST, *PWCE_DEVICELIST;

Единственное отличие между ними — структура для Windows 98 и Windows 2000 содержит массив структур WINDOWSJRDAJDEVICEJNFO вместо WCE_ IRDAJDEVICEJNFO. Условная директива *deflne объявляет DEVICEUST как соответствующую структуру, в зависимости от целевой платформы. Аналогично, существует и два объявления структуры IRDA_DEVICE_INFO.

typedef

struct _WINDOWS_IRDA_DEVICE_INFO

 

 

{

 

 

 

 

 

 

u_char

irdaDevlceID[4];

 

 

 

char

 

irdaDevlceName[22];

 

 

 

u_char

irdaOeviceHintsi;

 

 

 

u_char

irdaDeviceHints2;

 

 

 

u_char

irdaCharSet;

 

 

}

WINDOWS_IRDA_DEVICE_INFO, *PWINDOWS_IRDA_DEVICE_INFO,

 

 

 

FAR *LPWINDOWS_IRDA_DEVICE_INFO;

 

 

typedef

struct _WCE_IRDA_OEVICE_INFO

 

 

{

 

 

 

 

 

 

u_char

irdaDeviceID[4];

 

 

 

char

 

irdaDeviceName[22];

 

 

 

u_char

Reserved[2];

. >

^

}

WCE_IRDA_DEVICE_INFO, *PWCE_IRDA_DEVICE_INFO;

"f

 

Условная директива *define объявляет IRDAJDEVICEJNFO, опять-таки, в зависимости от платформы.

Как мы уже говорили, фактически нумерация ИК-устройств выполняется функцией getsockopt с параметром IRLMP_ENUM_DEVICES. Следующий код перечисляет идентификаторы всех ИК-устройств по соседству.

SOCKET

sock;

DEVICELIST

devList;

DWORD

dwListLen=sizeof(DEVICELIST);

sock = WSASocket(AF_IRDA, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);

devList.numDevice = 0;

Г Л А В А 6 Семейства адресов и разрешение имен

131

dwRet = getsockopt(sock, SOL_IRLMP, IRLMP_ENUMDEVICES, (char *)&devList, AdwHstLen);

Перед тем как структура DEVICELIST будет передана в вызове getsockopt, не забудьте присвоить полю numDevice значение О. При успешной нумерации полю numDevice будет присвоено положительное значение, равное числу структур IRDAJDEVICEJNFO в поле Device. В реальном приложении выполнять getsockopt придется неоднократно, чтобы отследить все устройства, попавшие в радиус связи. Например, программа должна пытаться обнаружить ИК-устройство не менее пяти раз. Для этого просто поместите вызов процедуры в цикл с коротким вызовом функции Sleep после каждой безуспешной нумерации.

Зная, как нумеровать ИК-устройства, создать клиент или сервер не сложно. Серверная часть немного проще, поскольку выглядит как «обычный» сервер, то есть никаких особых действий не требует. Вкратце порядок действия IrSock-сервера таков.

1.Создание сокета с семейством адресов AFJRDA и типом SOCK_STREAM.

2.Запись в структуру SOCKADDRJRDA имени службы сервера.

3.Вызов функции bind с описателем сокета и структурой SOCKADDRJRDA.

4.Вызов функции listen с описателем сокета и тайм-аутом.

5.Блокирование вызова функции accept для входящих запросов клиентов.

Действия клиента сложнее, поскольку необходимо нумеровать ИК-уст- ройства.

1.Создание сокета с семейством адресов AFJRDA и типом SOCKSTREAM.

2.Нумерация доступных ИК-устройств путем вызова getsockopt с параметром IRLMP_ENUMJ)EVICES.

3- Для каждого найденного устройства в структуру SOCKADDRJRDA — запись идентификатора найденного устройства, а также имени службы, к которой вы хотите подключиться.

4. Вызов функции connect с описателем сокета и структурой SOCKADDRJRDA. Это действие выполняется для каждой структуры, обработанной на шаге 3-

ОпросIAS

Существует два способа определить, запущена ли данная служба на конкретном устройстве. Первый — попытаться подключиться к службе, другой — запросить у IAS имя службы. Оба способа требуют нумерации всех ИК-устройств

ипопыток запросить каждое устройство, пока одно из них не ответит (или подключиться к нему). Запрос выполняется функцией getsockopt с параметром IRIMPJAS_QUERY. Указатель на структуру IAS_QUERY передается в параметре optval. И снова, существуют две структуры IAS_QUERY: одна — для Windows 98

иWindows 2000, а другая — для Windows СЕ. Вот их описания.

typedef struct .WINDOWS.IAS_QUERY

u_char

irdaDeviceID[4];

'*

'*'''

132

ЧАСТЬ II

Интерфейс прикладного программирования Winsock

char

 

irdaClassName[IAS_MAX_CLASSNAME];

char

 

irdaAttribName[IAS_MAX_ATTRIBNAME];

u_long

irdaAttribType;

union

 

 

 

 

LONG

irdaAttriblnt;

struct

 

{

 

 

 

 

 

u_long

Len;

 

 

u_char

OctetSeq[IAS_MAX_OCTET_STRING];

}

irdaAttribOctetSeq;

struct

 

 

 

u_long

Len;

 

 

u_long

CharSet;

 

 

u_char

UsrStr[IAS_MAX_USER_STRING];

}irdaAttribUsrStr;

}irdaAttribute;

}WINDOWS_IAS_QUERY, *PWINDOWS_IAS_QUERY, FAR «LPWINDOWS.IAS.QUERY;

typedef struct _WCE_IAS_QUERY

u_char

irdaDeviceID[4];

 

char

irdaClassName[61];

 

char

irdaAttribName[61];

 

u_short

irdaAttribType;

 

union

 

 

 

int

irdaAttriblnt;

 

struct

 

 

 

int

Len;

 

 

u_char

0ctetSeq[1];

iTO HKjJ

 

u_char

Reserved[3];

 

 

} irdaAttribOctetSeq;

 

struct

 

 

 

int

Len;

 

 

u_char

CharSet;

 

 

u_char

UsrStr[1];

 

 

u_char

Reserved[2];

 

}irdaAttribUsrStr;

}irdaAttribute;

}WCE_IAS_QUERY, *PWCE_IAS_QUERY;

Как видите, описания одинаковы, кроме длины некоторых символьных массивов.

Узнать LSAP-SEL-номер определенной службы просто: присвойте полю irdaClassName строку свойств для LSAP-SELs: IrDAIrLMP:LsapSel, а полю irda-

•ГЛАВА 6 Семейства адресов и разрешение имен

133

AttrtbuteName — имя запрашиваемой службы. Кроме того, укажите в поле irdaDevicelD действительный код устройства в радиусе связи.

Создание сокета

Поскольку IrSock поддерживает только потоки с установлением соединения, чтобы создать ИК-сокет, необходимо указать лишь несколько параметров. Зот, например, как создается ИК-сокет с помощью функций socket или WSASocket. Для Windows СЕ (из-за ограничений Winsock 1.1) используйте функцию socket.

s = socket(AF_IRDA, SOCK_STREAM, 0);

s = WSASocket(AF_IRDA, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);

Для определенности вы вправе передать 1RDA_PROTO_SOCK_STREAM в качестве параметра протокола. Впрочем, он не обязателен, поскольку в каталоге транспортов есть только одна запись семейства адресов AF_IRDA. Значение AF_IRDA в вызове заставляет по умолчанию использовать эту запись каталога транспортов.

Параметры сокета

Большинство 5О_-параметров сокета не применимы к IrDA. поддерживается лишь SO_LINGER. Специфичные для IrSock параметры сокета поддерживаются только сокетами семейства адресов AFJRDA. (Они обсуждаются в главе 9, посвященной параметрам сокета и их характеристикам).

ПротоколыIPX/SPX

Протокол Internetwork Packet Exchange (IPX) используется компьютерами с клиент-серверными сетевыми службами NetWare фирмы Novell. IPX обеспечивает связь без установления соединения между двумя процессами, следовательно, при передаче пакета рабочей станцией не гарантируется, что он достигнет пункта назначения. Если приложению требуется гарантировать доставку данных, причем именно по протоколу IPX, можно задействовать протокол более высокого уровня.- например, Sequence Packet Exchange (SPX) или SPX II, в которых SPX-пакеты передаются при помощи IPX. Winsock позволяет приложениям связываться по IPX под управлением Windows 95, Windows 98, Windows NT и Windows 2000, но не Windows CE.

Адресация

В IPX-сетях сегменты соединяются через IPX-маршрутизаторы. Каждому сегменту назначается уникальный четырехбайтный номер сети (network number). Эти номера используются IPX-маршрутизатами для управления подключениями между разными сегментами сети. Компьютер, подключенный к сегменту сети, идентифицируется при помощи шестибайтного номера узла (node number) — обычно это физический адрес сетевого адаптера. Узел

1 34

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

(компьютер) вправе запускать несколько процессов связи по IPX, для различения которых применяются номера сокетов

Для подготовки Winsock-клиента или сервера к подключению по IPX, необходимо настроить структуру SOCKADDRJPX Она определена в заголовочном файле Wsipx h, ссылка на него в приложении должна идти вслед за Winsock2 h Структура SOCKADDRJPX определена так

typedef struct sockaddr_ipx

{

 

short

sa_family,

char

sa_netnum[4],

char

sa_nodenum[6],

unsigned short sa_socket,

} SOCKADDR_IPX,

*PSOCKADDR_IPX, FAR *LPSOCKADDR_IPX,

Поле sajamily всегда равно AF_IPX Поле sajnetnum — 4-байтный номер сети в сегменте IPX-сети Поле sajiodenum — б-байтный номер узла Поле sa_socket представляет сокет или порт, используемый для различения IPXподключений на одном узле

Создание сокета

Создать IPX-сокет можно несколькими способами Для открытия 1РХ-соке- та вызовите функции socket или WSASocket с семейством адресов AFJPX, типом сокета SOCKJDGRAM и протоколом NSPROTOJPX

s = socket(AF_IPX, SOCK.DGRAM, NSPROTO.IPX), s = WSASocket(AF_IPX, SOCK.DGRAM, NSPROTO_IPX,

NULL, 0, WSA_FLAG_OVERLAPPED),

Заметьте, что третий параметр протокола должен быть обязательно задан и не равен 0 Это важно, поскольку поле протокола может использоваться для настройки особых типов IPX-пакетов

Как мы уже говорили, IPX обеспечивает ненадежное соединение без дейтаграмм Если приложению требуется надежное соединение с применением этого протокола, оно может использовать поверх IPX протоколы более высокого уровня, такие как SPX и SPX II Для этого необходимо при вызове функций socket или WSASocket задать соответствующие значения полей типа — SOCK_SEQPACKET или SOCKJTREAM, и протокола — NSPROTO_SPX или NSPROTOJPXII

Если тип сокета — SOCKJSTREAM, данные передаются в виде непрерывного потока байт, без разделения сообщений, подобно действию сокета в TCP/ IP Если тип сокета — SOCK_SEQPACKET, данные передаются с разделителями сообщений Например, передатчик отправляет 2000 байт — приемник не сможет ответить, пока не получит все 2000 байт В SPX и SPXII для этого нужно указать бит конца сообщения в заголовке SPX Для сокетов типа SOCK_ SEQPACKET подразумевается, что этот бит указан, и выполнение Winsockфункции recv и WSARecv не завершится, пока пакет не будет получен Для поточных сокетов бит конца сообщения не требуется, и выполнение функции recv будет завершено сразу же по получении любых данных, независи-

I

Г Л А ВА 6 Семейства адресов и разрешение имен

'135

мо от наличия бита конца сообщения С точки зрения отправителя при использовании типа SOCK_SEQPACKET сообщения размером меньше пакета, всегда передаются с указанным битом конца При отправке нескольких пакетов этот бит задается только в последнем пакете

Привязка сокета

Когда IPX-приложение при помощи функции bind создаст привязку локального адреса к сокету, указывать номер сети и адрес узла в структуре SOCKADDR IPX не нужно Функция bind заполнит эти поля при помощи первого же сетевого интерфейса IPX, доступного в системе Если на компьютере установлено несколько сетевых адаптеров, привязка к конкретному интерфейсу также не требуется В Windows 95, Windows 98, Windows NT и Windows 2000 реализована виртуальная внутренняя сеть, в которой к каждому сете вому адаптеру можно обратиться, независимо от того, к какой физической сети он подключен (Внутренние номера сети подробно рассмотрены далее в этой главе ) После успешной привязки приложения к локальному интерфейсу с помощью функции getsockname вы можете узнать номер локальной сети и номер узла следующим образом

SOCKETsdServer, SOCKADOR.IPX IPXAddr,

int addrlen = sizeof(SOCKADDR_IPX),

if ((sdServer = socket (AF_IPX, SOCK_DGRAM, NSPROTO.IPX))

== INVALID_SOCKET)

{

printf( socket failed with error Xd\n , WSAGetLastErrorO),

return,

ZeroMemory(&IPXAddr, sizeof(SOCKADDR_IPX)),

IPXAddr sa_family = AF_IPX,

IPXAddr sa_socket = htons(5150),

if (bind(sdServer, (PSOCKADDR) «JPXAddr, sizeof(SOCKADDR_IPX)) == SOCKET_ERROR)

{

pnntf( bind failed with error Xd\n , WSAGetLastErrorO),

return,

(getsockname((unsigned) sdServer, (PSOCKADDR) &IPXAddr, &addrlen) == SOCKET_ERR0R)

pnntf( getsockname failed with error Xd1, * '

WSAGetLastErrorO),

return,

136

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

// Вывод информации SOCKADDR_IPX, возвращенной getsockname()

Внутренний номер сети

В IPX номер сети (внутренний или внешний) определяет сегменты сети и применяется для маршрутизации IPX-пакетов между сегментами В Windows 95, Windows 98, Windows NT и Windows 2000 предусмотрен внутренний номер сети, используемый для внутренней маршрутизации и четкой идентификации компьютера при межсетевых подключениях (несколько сетей, соединенных мостами) Внутренний номер сети также называется виртуальным, поскольку определяет еще один (виртуальный) сегмент межсетевого соединения Таким образом, при настройке внутреннего номера сети для компьютеров под управлением Windows 95, Windows 98, Windows NT или Windows 2000 сервер NetWare или IPX-маршрутизатор добавят дополнительный транзит (hop) в маршрут к этому компьютеру

На компьютере с несколькими сетевыми адаптерами внутренняя виртуальная сеть выполняет специальную задачу Для привязки к локальному сетевому интерфейсу приложению не надо указывать информацию о локальном интерфейсе достаточно присвоить значение 0 полям sajnetnum и sanodenum структуры SOCKADDRJPX Дело в том, что IPX может маршрутизировать пакеты из любой внешней сети к любому локальному сетевому интерфейсу при помощи внутреннего номера сети Даже если приложение явно привязано к сетевому интерфейсу в сети А, а пакет пришел по сети В, внутренний номер сети все-таки позволит передать его приложению

УстановкатипаIPX-пакетасредствамиWinsock

Выбрать тип IPX-пакета можно при создании сокета, задав параметр NSPROTOJPX Поле типа пакета в IPX-пакете указывает тип службы, предложенной или запрошенной IPX-пакетом Фирмой Novell определены следующие типы пакетов

ШOlh — Routing Information Protocol (RIP),

Ш04h — Service Advertising Protocol (SAP),

Ш05h — Sequenced Packet Exchange (SPX), M l l h — NetWare Core Protocol (NCP),

14h — широковещательный пакет для Novell NetBIOS

Чтобы изменить типа IPX-пакета, достаточно просто указать NSPROTO_ IPX+ п в качестве параметра протокола в функции socket, где п — номер типа пакета Например, для открытия IPX-сокета с типом пакета 04h (SAP), вызовите socket так

s = socket(AF_IPX, SOCK.DGRAM, NSPROTO_IPX + 0x04);

СЛАВА 6 Семейства адресов и разрешение имен

137

разрешение имен

jpX-адресация в Winsock довольно неудобна, поскольку для формирования адреса нужно предоставить многобайтовые номера сети и узла Впрочем, IPX позволяет приложениям обнаруживать службы путем использования дружественных имен для получения номера сети, узла и порта по протоколу SAP Winsock 2 предоставляет независимый от протокола способ регистрации имен функцией WSASetService (подробней — в главе 10) По протоколу SAP IPX-сервер может задействовать эту функцию для регистрации под дружественным именем номеров сети, узла и порта, которые слушает Winsock 2 также предоставляет независимый от протокола способ разрешения имен с помощью функций WSAlookupServiceBegin, WSALookupServtceNext и WSALookupServiceEnd

Можно выполнить свою собственную регистрацию <имя — служба > и вести поиск, открыв IPX-сокет и выбрав тип SAP пакета После открытия сокета вы вправе начать широковещание SAP-пакетов в IPX-сети для регистрации и обнаружения в ней служб Но для этого необходимо хорошо знать протокол SAP и уметь программно декодировать SAP-пакет IPX

Протоколы NetBIOS

Этот интерфейс уже рассматривался в главе 1, поэтому обсуждаемый здесь материал покажется вам знакомым Для адресации NetBIOS из Winsock необходимо знать имена NetBIOS и номера LANA Здесь мы уделим основное внимание особенностям доступа к NetBIOS из Winsock

ПРИМЕЧАНИЕ Семейство адресов NetBIOS доступно в Winsock только под управлением Windows NT и Windows 2000 Па платформах Windows 9x и Windows СЕ оно недоступно

Адресация

Адресация компьютеров в NetBIOS основана на именах NetBIOS Напомним, что имя NetBIOS состоит из 16 символов, причем последний обозначает тип службы, к которой относится это имя Имена NetBIOS бывают уникальными и групповыми Уникальное имя может использоват ься только одним процессом в сети Например, если сеансовый сервер зарегистрируется под именем FOO, то для соединения с ним клиенты будут использовать это имя Под групповым именем может зарегистрироваться группа приложений — тогда направляемые на это имя дейтаграммы получат все зарегистрировавшие его процессы

Структура адресации NetBIOS в Wmsock определена в файле Wsnetbs h

«define NETBIOS_NAME_LENGTH 16

struct sockaddr nb

short snb_family, u_short snb_type,