Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
vesnoplias

Есть вопрос по сетевому программированию

13.02.2007, 11:52. Показов 6578. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу прогу для поиска файлов в сети по заданной маске.
Можно ли использовать процедуры FindFirstFile, FindNextFile в асинхронном режиме?
Или какими другими их можно заменить?
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2007, 11:52
Ответы с готовыми решениями:

Литература по сетевому программированию
Собственно захотел влезть в сетевое программирование на C++. Хотелось бы спросить, есть какие-нибудь книжки по этой теме, может быть блоги...

Литратура по сетевому программированию
Доброго времени суток, посоветуйте литературу по сетевому программированию на C#. Желательно на русском, но рассмотрю все варианты. С чего...

Литература по сетевому программированию
Не нашел более подходящего раздела для данного вопроса. Подскажите литературу по программированию мультиплеера в играх. Я сам честно...

1
0 / 0 / 1
Регистрация: 08.09.2006
Сообщений: 23
13.02.2007, 15:57
Лучший ответ Сообщение было отмечено как решение

Решение

Visual C++: Поиск ресурсов в локальной сети

Ресурсы локальной сети образуют древовидную структуру.

Самыми низшими ветвями дерева являются Sharepoint. Это ни что иное, как сетевые каталоги и сетевые принтеры. Всё дерево растет из одного корня. На втором уровне располагаются провайдеры. Скорее всего, вы встретитесь только с двумя провайдерами: Microsoft Network и NetWare. Стало быть, для того, чтобы узнать, какие ресурсы в вашей сети, вам придется писать программу, которая совершает обход представленного дерева. Не думайте, однако, что это безумно сложно. К, счастью, имеются функции АРI, которые легко справляются с поставленной задачей. Правда, без рекурсии все же не обойтись, но писать рекурсивные функции, господа, — это же одно удовольствие. Мы начнем с описания трех функций, с помощью которых собираемся изучать нашу сеть.

C++
1
2
3
4
5
6
7
8
DWORD WnetOpenEnum
{
 DWORD dwScope,
 DWORD dwType
 DWORD dwtUsage,
 LPNETRESOURCE lpNetResource,
 LPHANDLE lphEnum
}
Первый параметр — определяет множество, на котором ищутся ресурсы. Может принимать следующие значения: RESOURCE_CONNECTED, RESOURCE_CONTEXT, RESOURCE_GLOBALNET, RESOURCE_REMEMBERED.

Второй параметр — определяет тип искомого ресурса. Может принимать следующие значения: RESOURCETYPE_ANY, RESOURCETYPE_DISK, RESOURCETYPE_PRINT.

Третий параметр — принимает следующие значения: 0 (для всех ресурсов), RESOURCEUSAGE_CONNECTABLE, RESOURCEUSAGE_ALL, RESOURCEUSAGE_CONTAINER, RESOURCEUSAGE_ATTACHED.

Четвертый параметр — является указателем на структуру NETRESOURCE. Если первый параметр не равен RESOURCE_GLOBALNET, то данный параметр следует положить равным нулю. Если вы хотите начать поиск с самого начала (от корня) дерева, то первый раз следует вызвать функцию с параметром равным NULL.

Пятый параметр — является указателем на переменную, которая в случае успешного выполнения функции становится дескриптором поиска.

Следующая функция осуществляет всю работу по поиску ресурсов данного уровня.

C++
1
2
3
4
5
6
7
DWORD WnetEnumResource
{
 HANDLE hEnum,
 LPDWORD lpcCount,
 LPVOID lpBuffer,
 LPDWORD lpBufferSize
}
Первый параметр - дескриптор поиска, полученный в результате работы функции WnetEnumResource.

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

Третий параметр — указывает на буфер, который получит информацию о найденных ресурсах. Функция трактует этот буфер, как массив из структур NETRESOURCE. Следует взять гарантированно большой буфер.

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

Как и другие Wnet-функции, данная функция возвращает NO_ERROR, если она выполнилась успешно. Сообщение об ошибке - ERROR_NO_MORE_ITEMS - говорит нам, что не найдено ни одного ресурса.

Последняя в указанном ряду функция закрывает поиск, на который указывает дескриптор hEnum.

C++
1
2
3
4
DWORD WnetCloseEnum
{
 HANDLE hEnum
}
Теперь у нас все готово для поиска ресурсов в локальной сети. Поскольку мы заранее не знаем глубины поиска, алгоритм должен быть рекурсивным. Ниже представлена консольная программа, проходящая все дерево сетевых ресурсов и выдающая на консоль сетевое имя ресурса и комментарий к нему.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "stdafx.h"
#include <windows.h>
 
void poisk(NETRESOURCE,int);
 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 NETRESOURCE NT;
 poisk(NT,0);
 return 0;
}
 
//функция поиска сетевых ресурсов
void poisk(NETRESOURCE nt, int pr)
{
 DWORD l,m,r;
 HANDLE h;
 int i;
 NETRESOURCE ntbuf[1000];
 char s[100];
 if(!pr)
  l = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, &nt, &h);
 else
  l = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, &nt, &h);
 
 if(l==NO_ERROR)
 {
  //ресурс открыт
  do
  {
   //просим вывести максимальное количество записей
   m=0xFFFFFFFF;
   //размер буфера
   r=32000;
   //обнуляем буфер
   l=WNetEnumResource(h, &m, &ntbuf, &r);
   if(l==NO_ERROR)
   {
    //здесь смотрим, что за ресурс мы получили
    //вывод информации
    for(i=0; i<m; i++)
    {
     if(ntbuf[i].lpRemoteName!=NULL)
     {
      //сетевое имя
      CharToOem(ntbuf[i].lpRemoteName,s);
      printf("%s ",s);
      //комментарий
      CharToOem(ntbuf[i].lpComment,s);
      printf("Comments: %s ",s);
     }
     //рекурсивный вызов
     poisk(ntbuf[i],1);
    }
   }else if(l!=ERROR_NO_MORE_ITEMS)
   {
    //ошибка, нужно выходить из цикла
    break;
   }
  }
  while(l!=ERROR_NO_MORE_ITEMS);
  WNetCloseEnum(h);
 }
}
Теперь прокомментируем программу, представленную выше.

Функция poisk вполне универсальна и может быть приспособлена для разных программ. Она позволяет не только просматривать все дерево сетевых ресурсов. Структуру NETRESOURCE можно заполнить для любого уровня и вызвать функцию, указав значение второго параметра неравным нулю. для этого необходимо задать следующие поля: dwScore, dwType, dwUsage(0), lpRemoteName, lpLocalName(NULL).
Функция WNetEnumResource не позволяет определять скрытые ресурсы (сетевые диски с именами, оканчивающимися на ‘$‘). Для этой цели следует использовать функцию из другой группы - что мы и делаем ниже.
Проверка if(ntbuf[i].lpRemoteName!=NULL) необходима для запуска программы на рабочих станциях с операционными системами Windows 95/98/МЕ. На втором уровне у данных операционных систем lpRemoteName оказывается равным NULL.
В заключении параграфа приведем пример на использование функции NetShareEnum. Пример взят из документации Microsoft и несколько переработан.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "stdafx.h"
 
#define UNICODE
#include <windows.h>
#include <stdio.h>
#include <lm.h>
 
 
//для использования Unicode имя главной функции wmain
int wmain(int argc, char *lpszArgv[ ])
{
 PSHARE_INFO_502 BufPtr,p;
 NET_API_STATUS res;
 LPTSTR lpszServer = NULL;
 DWORD er=0,tr=0,resume=0, i;
 char * ers="Error: ";
 //разбор командной строки
 if(argc==2)
 lpszServer =(LPTSTR) lpszArgv[1]; else
 {
  printf("Usage: NetShareEnum <servername> ");
  return;
 };
 printf("Share: Local Path: User:  Descriptor: ");
 printf("----------------------------------------- ");
  do
  {
   //получить информацию об общих ресурсах на сервере
   res=NetShareEnum((LPWSTR)lpszServer,502,(LPBYTE *) _
   &BufPtr, -1, &er, &tr, &resume);
   if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
   {
    p=BufPtr;
    //цикл по всем записям
    for(i=1;i<=er;i++)
    {
     printf("%-20S%-30S%-8u",p->shi502_netname, _
     p->shi502_path, p->shi502_current_uses);
     if(IsValidSecurityDescriptor_
               (p->shi502_security_descriptor))
      printf("Yes ");
     else
      printf("No ");
     p++;
    }
    NetApiBufferFree(BufPtr);
   }
   else
   {
    //код ошибки
    printf("%s %ld ", ers, res);
   }
  }
  while(res==ERROR_MORE_DATA);
  return;
}
При запуске программы в командной строке следует указать путь к серверу. Например, если в сети есть сервер Lilia, а имя программы net3 следует набрать net3 Lilia либо net3 \Lilia. Типичные ошибки, которые может возвратить программа - это 50 - сетевой запрос не поддерживается, 53 - неверный путь. В первом случае ошибка означает, что на запрашиваемом компьютере, по-видимому, работает операционная система Windows 95/98/МЕ, во втором случае вы неправильно набрали имя сервера.

Так же программа находит скрытые устройства, которые невозможно обнаружить с помощью функции WnetEnumResourcu.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2007, 15:57
Помогаю со студенческими работами здесь

Литература по сетевому программированию
Здравствуйте. Приступаю к изучению сетевого программирования. Какую литературу можете посоветовать для новичка? Может есть какие-то...

Книга по сетевому программированию
Привет всем. Я тут после разработки игр решил заняться сетевым программированием на C++ под Windows. И столкнулся с проблемой - информация....

Литература по сетевому программированию
Всем доброго дня.Хотелось бы задать такой вопрос.Что можно почитать по сетевому программированию?Сейчас хотел начать создавать...

Книги по сетевому программированию
Здравствуйте, передомной стоит задача разработать сервер и клиенское приложение которое будет взаимодействовать с сервером. Подскажите...

Книги по сетевому программированию
Здравствуйте, передомной стоит задача разработать сервер и клиенское приложение которое будет взаимодействовать с сервером. Подскажите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru