Рис. 3.4.4. Рекурсивный поиск сетевых ресурсов в локальной сети.
Трансляция программы на Рис. 3.4.4.
MASM32:
ml /c /coff /DMASM net1.asm link /subsystem:console /STACK:1000000,1000000 net1.objTASM32:
tasm32 /ml net1.asm tlink32 -ap -S:1000000 -Sc:1000000 net1.obj
Программа на Рис. 3.4.4 довольно сложна и требует серьезных пояснений. Прежде всего хочу сказать, что, если читатель действительно хочет разобраться в сетевом программировании (я в данном случае имею в виду локальную сеть)44, ему необходимо самостоятельно написать несколько программ. Мои программы должны служить отправными точками.
- Нам уже приходилось сталкиваться с локальными переменными, когда мы
рассматривали поиск файлов по дереву каталогов. Данная задача весьма похожа, но
есть и отличие. В данном случае мы используем слишком большой объем для
локальных переменных. По этой причине мы явно указываем (заказываем) большой
объем стека (опции
STACK
иS
,Sc
). По умолчанию компоновщик устанавливает всего 8 Кб, что явно не достаточно. - Функция
WNetEnumResource
требует указать своим параметром массив структурNETRESOURCE
. Объем одной структуры 32 байта. Мы резервируем тысячу таких структур. Не много ли, скажете Вы? Честно говоря, я не встречал локальной сети с тысячью сетевых компьютеров. Однако я встречал локальную сеть, где на одном из серверов было создано около восьмисот сетевых каталогов. Если говорить начистоту, то здесь я все же демонстрирую не лучший стиль программирования. Более корректный путь заключается в том, что функцияWNetEnumResource
вначале вызывается с указанием объема буфера меньше, чем 32 байта, - в этом случае в переменную, содержащую объем буфера, будет возвращен необходимый объем. Зная необходимый объем, программа должна запросить у системы нужный и вторично запуститьWNetEnumResource
. Данный подход более корректен, но более сложен. - При рекурсивном вызове процедуры
POISK
первым параметром является указатель на элемент массива структурNETRESOURCE
. Мы копируем элемент массива в локальную переменнуюNR1
. В принципе, в данной программе можно этого не делать, а сразу воспользоваться полученным указателем. В более сложных программах, однако, скорее всего, придется этот делать. - Обратите внимание, что в процедуре вывода информации мы копируем строку в
буфер, который потом используем для вывода. Это не прихоть, а необходимость.
Дело в том, что перед выводом мы добавляем в конец строки коды
13
и10
. Поскольку мы выводим строки, которые потом используем для дальнейшего поиска, нам приходится использовать для вывода дополнительный буфер.
Что осталось за бортом?
Мы коснулись сетевого программирования весьма поверхностно. Заинтересованному читателю могу перечислить те вопросы, которые он мог бы изучить, воспользовавшись соответствующей литературой.
- Сетевое программирование на сервере Windows NT.
- Изучение сетевых протоколов как низкого (
IPX
,TCP/IP
,NetBios
и т.д.), так и высокого уровня (HTTP
,FTP
и т.д.). - Программирование сокетов.
44 Сейчас часто под термином сетевое программирование понимают программирование в глобальной сети Интернет, либо использование подходов и средств Интернет в локальной сети (Интранет). Мы, в данном случае, ведем речь о достаточно узкой области задач, касающейся проблем только локальной сети.