Сеть

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 10.11.2003 (Пн) 9:55

не тогда можно просто напросто сделать прогу, которая:
1. открывает левый порт, (например 15151й) для чтения
2. Используя список компов сети, проверяет открыт ли этот порт у них
а) если открыт - вносим инфу в список о компе
а) если заткрыт - смотрим дальше
Это что касается списка
3. Коннектится с теми, с кем считаешь нужным ... т.е. простой КЛИЕНТ-СЕРВЕР
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Ronin_1978
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 05.04.2003 (Сб) 14:42
Откуда: Москва

Сообщение Ronin_1978 » 10.11.2003 (Пн) 12:22

Имена влючённых компьютеров можно узнать ещё вот так:
Код: Выделить всё
'На форме создай ListBox а этот код положи в модуль
Private Const RESOURCE_CONNECTED As Long = &H1&
Private Const RESOURCE_GLOBALNET As Long = &H2&
Private Const RESOURCE_REMEMBERED As Long = &H3&
Private Const RESOURCEDISPLAYTYPE_DIRECTORY& = &H9
Private Const RESOURCEDISPLAYTYPE_DOMAIN& = &H1
Private Const RESOURCEDISPLAYTYPE_FILE& = &H4
Private Const RESOURCEDISPLAYTYPE_GENERIC& = &H0
Private Const RESOURCEDISPLAYTYPE_GROUP& = &H5
Private Const RESOURCEDISPLAYTYPE_NETWORK& = &H6
Private Const RESOURCEDISPLAYTYPE_ROOT& = &H7
Private Const RESOURCEDISPLAYTYPE_SERVER& = &H2
Private Const RESOURCEDISPLAYTYPE_SHARE& = &H3
Private Const RESOURCEDISPLAYTYPE_SHAREADMIN& = &H8
Private Const RESOURCETYPE_ANY As Long = &H0&
Private Const RESOURCETYPE_DISK As Long = &H1&
Private Const RESOURCETYPE_PRINT As Long = &H2&
Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFF&
Private Const RESOURCEUSAGE_ALL As Long = &H0&
Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1&
Private Const RESOURCEUSAGE_CONTAINER As Long = &H2&
Private Const RESOURCEUSAGE_RESERVED As Long = &H80000000
Private Const NO_ERROR = 0
Private Const ERROR_MORE_DATA = 234                       
Private Const RESOURCE_ENUM_ALL As Long = &HFFFF
Private Type NETRESOURCE
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    pLocalName As Long
    pRemoteName As Long
    pComment As Long
    pProvider As Long
End Type
Private Type NETRESOURCE_REAL
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    sLocalName As String
    sRemoteName As String
    sComment As String
    sProvider As String
End Type
Private Declare Function WNetAddConnection2 Lib "mpr.dll" _
    Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, _
    ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Private Declare Function WNetOpenEnum Lib "mpr.dll" _
    Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long _
    , ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" _
    Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, _
    lpBuffer As NETRESOURCE, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" _
    (lpTo As Any, lpFrom As Any, ByVal lLen As Long)
Private Declare Sub CopyMemByPtr Lib "kernel32" Alias "RtlMoveMemory" _
    (ByVal lpTo As Long, ByVal lpFrom As Long, ByVal lLen As Long)
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long
Public strUserName As String
Public strMachinerName As String
Sub Main()
    Form1.Show
    Const MAX_RESOURCES = 256
    Const NOT_A_CONTAINER = -1
    Dim bFirstTime As Boolean
    Dim lReturn As Long
    Dim hEnum As Long
    Dim lCount As Long
    Dim lMin As Long
    Dim lLength As Long
    Dim l As Long
    Dim lBufferSize As Long
    Dim lLastIndex As Long
    Dim uNetApi(0 To MAX_RESOURCES) As NETRESOURCE
    Dim uNet() As NETRESOURCE_REAL
    bFirstTime = True
    Do
        If bFirstTime Then
            lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, _
                RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, ByVal 0&, hEnum)
            bFirstTime = False
        Else
            If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER Then
                lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, _
                    RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNet(lLastIndex), hEnum)
            Else
                lReturn = NOT_A_CONTAINER
                hEnum = 0
            End If
            lLastIndex = lLastIndex + 1
        End If
        If lReturn = NO_ERROR Then
            lCount = RESOURCE_ENUM_ALL
            Do
                lBufferSize = UBound(uNetApi) * Len(uNetApi(0)) / 2
                lReturn = WNetEnumResource(hEnum, lCount, uNetApi(0), lBufferSize)
                If lCount > 0 Then
                    ReDim Preserve uNet(0 To lMin + lCount - 1) As NETRESOURCE_REAL
                    For l = 0 To lCount - 1
                        uNet(lMin + l).dwScope = uNetApi(l).dwScope
                        uNet(lMin + l).dwType = uNetApi(l).dwType
                        uNet(lMin + l).dwDisplayType = uNetApi(l).dwDisplayType
                        uNet(lMin + l).dwUsage = uNetApi(l).dwUsage
                        lLength = lstrlen(uNetApi(l).pRemoteName)
                        uNet(lMin + l).sRemoteName = Space$(lLength)
                        CopyMem ByVal uNet(lMin + l).sRemoteName, ByVal uNetApi(l).pRemoteName, lLength
                    Next l
                End If
                lMin = lMin + lCount
            Loop While lReturn = ERROR_MORE_DATA
        End If
        If hEnum Then
            l = WNetCloseEnum(hEnum)
        End If
    Loop While lLastIndex < lMin
    If UBound(uNet) > 0 Then
        For l = 0 To UBound(uNet)
            Form1.List1.AddItem uNet(l).sRemoteName & " " & uNet(l).dwDisplayType
        Next l
    End If
End Sub

Код не мой, врать не буду, нагло спёр из API Guide и покоцал под себя. Попробуй, может подойдёт...
... На небесах святые - ты слышишь стоны?
По тебе плачет колокол, а где-то во мраке
На ветру качаются вопросительные знаки... (С) Каста.

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 10.11.2003 (Пн) 22:04

Нет список по прежнему пуст ! Есть еще идей? :?
Max!

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 11.11.2003 (Вт) 9:48

Имена влючённых компьютеров можно узнать ещё вот так:
Код:
'На форме создай ListBox а этот код положи в модуль
Private Const RESOURCE_CONNECTED As Long = &H1&
Private Const RESOURCE_GLOBALNET As Long = &H2&
Private Const RESOURCE_REMEMBERED As Long = &H3&
Private Const RESOURCEDISPLAYTYPE_DIRECTORY& = &H9
Private Const RESOURCEDISPLAYTYPE_DOMAIN& = &H1
Private Const RESOURCEDISPLAYTYPE_FILE& = &H4
Private Const RESOURCEDISPLAYTYPE_GENERIC& = &H0
Private Const RESOURCEDISPLAYTYPE_GROUP& = &H5
Private Const RESOURCEDISPLAYTYPE_NETWORK& = &H6
Private Const RESOURCEDISPLAYTYPE_ROOT& = &H7
Private Const RESOURCEDISPLAYTYPE_SERVER& = &H2
Private Const RESOURCEDISPLAYTYPE_SHARE& = &H3
Private Const RESOURCEDISPLAYTYPE_SHAREADMIN& = &H8
Private Const RESOURCETYPE_ANY As Long = &H0&
Private Const RESOURCETYPE_DISK As Long = &H1&
Private Const RESOURCETYPE_PRINT As Long = &H2&
Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFF&
Private Const RESOURCEUSAGE_ALL As Long = &H0&
Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1&
Private Const RESOURCEUSAGE_CONTAINER As Long = &H2&
Private Const RESOURCEUSAGE_RESERVED As Long = &H80000000
Private Const NO_ERROR = 0
Private Const ERROR_MORE_DATA = 234
Private Const RESOURCE_ENUM_ALL As Long = &HFFFF
Private Type NETRESOURCE
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
pLocalName As Long
pRemoteName As Long
pComment As Long
pProvider As Long
End Type
Private Type NETRESOURCE_REAL
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
sLocalName As String
sRemoteName As String
sComment As String
sProvider As String
End Type
Private Declare Function WNetAddConnection2 Lib "mpr.dll" _
Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Private Declare Function WNetOpenEnum Lib "mpr.dll" _
Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long _
, ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" _
Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, _
lpBuffer As NETRESOURCE, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" _
(lpTo As Any, lpFrom As Any, ByVal lLen As Long)
Private Declare Sub CopyMemByPtr Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal lpTo As Long, ByVal lpFrom As Long, ByVal lLen As Long)
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long
Public strUserName As String
Public strMachinerName As String
Sub Main()
Form1.Show
Const MAX_RESOURCES = 256
Const NOT_A_CONTAINER = -1
Dim bFirstTime As Boolean
Dim lReturn As Long
Dim hEnum As Long
Dim lCount As Long
Dim lMin As Long
Dim lLength As Long
Dim l As Long
Dim lBufferSize As Long
Dim lLastIndex As Long
Dim uNetApi(0 To MAX_RESOURCES) As NETRESOURCE
Dim uNet() As NETRESOURCE_REAL
bFirstTime = True
Do
If bFirstTime Then
lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, _
RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, ByVal 0&, hEnum)
bFirstTime = False
Else
If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER Then
lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, _
RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNet(lLastIndex), hEnum)
Else
lReturn = NOT_A_CONTAINER
hEnum = 0
End If
lLastIndex = lLastIndex + 1
End If
If lReturn = NO_ERROR Then
lCount = RESOURCE_ENUM_ALL
Do
lBufferSize = UBound(uNetApi) * Len(uNetApi(0)) / 2
lReturn = WNetEnumResource(hEnum, lCount, uNetApi(0), lBufferSize)
If lCount > 0 Then
ReDim Preserve uNet(0 To lMin + lCount - 1) As NETRESOURCE_REAL
For l = 0 To lCount - 1
uNet(lMin + l).dwScope = uNetApi(l).dwScope
uNet(lMin + l).dwType = uNetApi(l).dwType
uNet(lMin + l).dwDisplayType = uNetApi(l).dwDisplayType
uNet(lMin + l).dwUsage = uNetApi(l).dwUsage
lLength = lstrlen(uNetApi(l).pRemoteName)
uNet(lMin + l).sRemoteName = Space$(lLength)
CopyMem ByVal uNet(lMin + l).sRemoteName, ByVal uNetApi(l).pRemoteName, lLength
Next l
End If
lMin = lMin + lCount
Loop While lReturn = ERROR_MORE_DATA
End If
If hEnum Then
l = WNetCloseEnum(hEnum)
End If
Loop While lLastIndex < lMin
If UBound(uNet) > 0 Then
For l = 0 To UBound(uNet)
Form1.List1.AddItem uNet(l).sRemoteName & " " & uNet(l).dwDisplayType
Next l
End If
End Sub


Код не мой, врать не буду, нагло спёр из API Guide и покоцал под себя. Попробуй, может подойдёт...


Почему кокгда я начинаю юзать этот модуль с кодом , например:

Код: Выделить всё
Private Sub Command1_Click()
Call Main
End Sub


После комп виснит! :evil:
Max!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.11.2003 (Вт) 11:16

Тебе не нужен список всех машин, тебе нужен список машин, на которых установлен клиент (или сервер, если говорить правильно).
Итак, сервера ставяться на машины и слушают порт A. На твоей машине стоит клиентская часть, которая позволяет тушить машины, отправляя команды по порту A. Для того, чтобы определить, с какими машинами можно работать, используется следующий алгоритм.

Клиент (админская часть). При запуске выдает по UDP Broadcast по порту B типа "вот он я, админ, IP-адрес такой-то, отзовитесь" и в течении, например, 10 секунд, ждет ответа от остальных машин.
Сервера (пользовательская часть). Раз в пять секунд слушают порт B. Если получен запрос от админской части, отзываются типа "я IP-адрес такой-то, имя такое-то, готов к работе".
Клиент (админская часть). Всех ответивших выводит в ComboBox и начинается рабочий цикл: при необходимости посылает по TCP на нужный адрес различные команды.
Lasciate ogni speranza, voi ch'entrate.

Ronin_1978
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 05.04.2003 (Сб) 14:42
Откуда: Москва

Сообщение Ronin_1978 » 11.11.2003 (Вт) 11:32

2Max!
Комп не виснет, просто этот код медленно работает.
На моей машине - Cel 1700, DDR 256 обработка идёт 30-40 секунд
... На небесах святые - ты слышишь стоны?
По тебе плачет колокол, а где-то во мраке
На ветру качаются вопросительные знаки... (С) Каста.

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 11.11.2003 (Вт) 21:13

А если юзать такои код :

Код: Выделить всё
Private Sub Timer1_Timer()
Shell ("Ping(0) -a computer1 >C:\111.txt")
If Ping(0) + 1 Then
List1.AddItem "computer1"
Else
If Ping - 1 Then List1.ListIndex = -1
Exit Sub
End If
Timer1.Enabled = False


Этот код может реагировать на вкл. компы?
Мне кажется он просто дабовляет в список List1.AddItem "computer1" и все! :roll:
Max!

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 12.11.2003 (Ср) 0:22

С полностью согласен с alibek, именно об этом я и говорил... но спешу заметить, что сам "Комп №1" не может послать команду машине чтобы показвть "ВОт он я" ... для начала нада имя компика знать ... а это как я понимаю суть нашей проблемы ... на данный момент :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 12.11.2003 (Ср) 0:28

А вот этот код

Код: Выделить всё
Private Sub Timer1_Timer()
Shell ("Ping(0) -a computer1 >C:\111.txt")
If Ping(0) + 1 Then
List1.AddItem "computer1"
Else
If Ping - 1 Then List1.ListIndex = -1
Exit Sub
End If
Timer1.Enabled = False


мне вообще подозрительным кажется ... ну я бы сказал "не может он реагировать на все компы" :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.11.2003 (Ср) 12:08

Чтобы узнать имя локальной машины, можно использовать API GetComputerName().

P.S. А, понял. Ты имеешь ввиду, комп №1 не знает, кому рассылать сообщения? Я же сказал, broadcast'ом он рассылает по протоколу UDP, т.е. всем, на адрес (например) 192.168.1.255. В конце концов на локальной машине узнать адрес своей сети никогда не составляло проблемы.
Lasciate ogni speranza, voi ch'entrate.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 13.11.2003 (Чт) 0:45

Ну вообще если локалка, тогда там ну даже если 50 машин то их ИП можно записать ... или же !даже, имена машин в список поместить обработки :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 19.11.2003 (Ср) 18:30

Все раотает! Кроме км. Каторая вкл компы ! Я пробовал на одном кампе не не выключает ничего не происходит или ошибка где посылаем команду вырубить:

WinPort.SendData "MUST DIE"

Есть еще комманды? :D
Max!

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 20.11.2003 (Чт) 0:50

Н-дааа...
На компе висит клиент(прога без визуального интерфейса, точнее твоя прога, которая списки машин в сети составляет, в ней должен быть код ответа на это вопрос*), и воспринимает эту команду ... ты клиента написал??? ....

-------------------------------------
Примечание: * кстати получается что любой комп может тебя отключить :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 20.11.2003 (Чт) 2:02

Да! Работали только два компа и я проверил ,
Client - клиент Server - итак ясно ! При включении комп1(Client) посылает свой ник на Сервер(я сделал отдельно пругу чтобы проверить выкл.) , и записывает его в Label1.label ! И есть кнопка с кодом(на серваке):

If Label1.Caption = "Comp1" Then
WinPort.SendData "MUST DIE"
End if

Да ник клиента появляется я нажимаю на кнопку и ФИГА ! Выкл не произашло!

Может из-за того , что На серваке Win98 , а у клиента WinXP а? :?: :roll:
Max!

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 21.11.2003 (Пт) 1:14

Смотри...

rundll32 keyboard,disable - выключить клавиатуру
rundll32 mouse,disable - выключить мышку
rundll32 user,swapmousebutton - поменять местами кнопки мыши
rundll32 user,disableoemlayer - спровацировать сбой системы
rundll32 shell32,SHExitWindowsEx 0 - выход из текущего пользователя
rundll32 krnl386.exe,exitkernel - выключить комп без вопросов
rundll32 shell32,ShellAboutA Info-Box - показать окно About Windows

Когда клиент устанавливает соединение и посылает свой ник...
Сервак получив ник может вырубить комп... как это реализовать ...

Вот:)
На клиенте пишем:

Код: Выделить всё
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim AAA As String
Winsock1.GetData AAA
'в 98й работает
If AAA = "MUST DIE" Then Shell "rundll32 krnl386.exe,exitkernel"
End Sub


Winsock1 - это винсок клиента если имя не менял то таоке и оставь :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron