Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как узнать, что делается с файлами? http://www.cyberforum.ru/cpp-beginners/thread1291.html
Как узнать какие файлы сейчас использует операционная система Windows, в частности: читает, пишет, используются, перемещается, копируется, удаляется. Путь тотального анализа диска не подойдет. Неплохо так же узнать, какие процессы сейчас открыты (связка: процесс – файл на диске). Интересуют API функции, можно программные тексты на СИ. П.С. FileMon for Windows самая близкая к задаче.
C++ Надо сделать несколько курсоров мыши на экране Подскажите, возможно ли реализовать такую задачу: Нужно сделать одновременно несколько курсоров мыши на экране. Расположены они к примеру на определённом расстоянии друг от друга и при движении мыши двигаются все одновременно, при нажатии на левую кнопку мыши, нажимаются сразу все курсоры мыши. Очень надо реализовать! Помогите! http://www.cyberforum.ru/cpp-beginners/thread1289.html
Помогите с преобразованием строк C++
Помогите плиз. м.б. кто-нибудь знает функцию для преобразования AnsiString в char*
C++ Доделать программу
Помогите плиз, доделать прогу. Ввести массив нецелых чисел. Те из них, которые положительны, копировать в другой массив. Затем отсортировать оба массива: один по возрастанию, другой по убыванию. Для каждого массива подсчитать сумму. Для каждого массива найти максимум и минимум. #include <iostream.h> #include <conio.h> #include <stdio.h> #include <string.h> void main(void){ double Mas;...
C++ Ошибки в программе http://www.cyberforum.ru/cpp-beginners/thread1093.html
Уважаемые, помогите найти ошибки в программе (задачка из института): Ниже приведен алгоритм «атомарной» функции, которая меняет местами верхние значения в двух стеках. Если один из стеков пуст, то второй не должен изменяться. В функцию никогда не передаются указатели на один и тот же стек. Void AtomicSwap(Stack *s1, Stack *s2) { Int v1, v2, rez; s1->lock.Acquire(); ...
C++ Отсортировать список и сформировать новый, состоящий из порядковых номеров его четных элементов Дан список с элементами целого типа. Отсортировать его по возрастанию, а затем сформировать новый список, состоящий из порядковых номеров четных элементов исходного списка. Вывести на экран исходный список до сортировки и после сортировки, а также полученный список порядковых номеров. подробнее

Показать сообщение отдельно
nydle
Сообщений: n/a
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.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru