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

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

13.02.2007, 11:52. Показов 6547. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru