Winsock - сетевой статус

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DKbelRoma
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 282
Зарегистрирован: 13.09.2007 (Чт) 23:32
Откуда: Из Кривого Рога

Winsock - сетевой статус

Сообщение DKbelRoma » 30.12.2007 (Вс) 20:59

Как можно удобным способом с помощью Winsock узнать включена ли программа - сервер на другом компьютере и показать мне например
Код: Выделить всё
MsgBox "Компьютер в сети", vbOK , "Подключиться"

А если неподключен, то соответсвенный MsgBox показать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 23:07

При такой постановке вопроса - никак.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

DKbelRoma
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 282
Зарегистрирован: 13.09.2007 (Чт) 23:32
Откуда: Из Кривого Рога

Сообщение DKbelRoma » 30.12.2007 (Вс) 23:30

Хакер а как тогда??
Вобщем мне нужно типа если я хочу подключиться через Winsock по IP, и если сервер не включон, что бы небыло лишних ошибок в программе я хотел показать пользователю, что сервер выключен или что нить такого.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 23:34

Для этого есть таймаут. Если таймаут наступил, то сервер выключен (хотя и не факт).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 31.12.2007 (Пн) 11:03

2 DKbelRoma: А сервер программы твой или другой программы ?

DKbelRoma
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 282
Зарегистрирован: 13.09.2007 (Чт) 23:32
Откуда: Из Кривого Рога

Сообщение DKbelRoma » 31.12.2007 (Пн) 12:27

ALX_2002 вобщем я пробую написать чат, и клиент и сервер находиться в одной программе. Использую Winsock. Подключаюсь к определённому порту по IP адресу, но если указанный мною IP (компьютер) в данный момент программу не включил, тогда мне показывает ошибка и программа выключаеться, Так вот мне нужно сначала проверить подключение, а затем подключиться если компьютер в сети. Как это можно сделать наиболие удобным способом?

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 31.12.2007 (Пн) 13:05

Набросал примерчик. Давно с винсоком не имел дела. Так что проверку соединения по статусам не совсем правильно сделал. Но вроде работает. :)

Код: Выделить всё

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim Winsock As Object
Dim WinSockState(9) As String

Private Sub Form_Activate()
    Set Winsock = CreateObject("MSWinsock.Winsock.1")
   
    WinSockState(0) = "sckClosed 0 Default. Closed"
    WinSockState(1) = "sckOpen 1 Open"
    WinSockState(2) = "sckListening 2 Listening"
    WinSockState(3) = "sckConnectionPending  3 Connection pending"
    WinSockState(4) = "sckResolvingHost  4 Resolving host"
    WinSockState(5) = "sckHostResolved  5 Host resolved"
    WinSockState(6) = "sckConnecting  6 Connecting"
    WinSockState(7) = "sckConnected  7 Connected"
    WinSockState(8) = "sckClosing  8 Peer is closing the connection"
    WinSockState(9) = "sckError  9 Error"
   
    Connect "http://www.ya.ru", "80"
    Connect "http://www.google.ru", "80"
    Connect "127.0.0.1", "80"

End Sub

Function Connect(HostName, port)
    Winsock.Close
    Winsock.Connect HostName, port
    Print "Connecting to " & HostName & " on port=" & port
    Do
        Print WinSockState(Winsock.State)
        Select Case Winsock.State
        Case 4, 5, 7, 8, 9
            Exit Do
            Print vbCrLf
        End Select
        Sleep 100
        DoEvents
    Loop
End Function

2vv
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 14.03.2008 (Пт) 17:36

Сообщение 2vv » 14.03.2008 (Пт) 17:59

Нашел эту тему поиском. Так как задача стоит почти такая же как у автора , не стал создавать новую тему. А вопрос стоит в следующем, можно ли winsock-а использовать для определения статуса компьютера в сети(включен\выключен), например зная что когда комп работает , то у него открыт определенный порт, например 80 ?
Сразу скажу уровень знаний низкий, новичек. Воспользовался примером ALX_2002 . И не знаю как понимать результат работы. Проблема в том , что , похоже программка определяет статус порта моего компьютера, а не удаленного. То есть если я указываю, например, несуществующий комп и выбираю порт , который точно открыт на моём компе то программка выдает статус - "sckConnected 7 Connected" . B наоборот , если я указываю заведомо существующую машину в сети , с заведомо открытым портом , но указанный порт закрыт на моем компе , то результат работы - "sckError 9 Error" . Так и должно быть ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.03.2008 (Пт) 18:39

Для определения статуса компьютера (сетевого интерфейса, в общем случае) в сети его надо пинговать. А не заниматься фигнёй.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

2vv
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 14.03.2008 (Пт) 17:36

Сообщение 2vv » 14.03.2008 (Пт) 18:51

Хакер , поясните , почему нельзя использовать winsock и "мониторить" состояние порта, вместо пинга.
Пинг устраивает. На этом же форуме нашел пример от RayShade:

strComputer = "."
Set objWMIService = GetObject(_
"winmgmts:\\" & strComputer & "\root\cimv2")
Set colPings = objWMIService.ExecQuery _
("Select * From Win32_PingStatus where Address = '192.168.1.1'")

For Each objStatus in colPings
If IsNull(objStatus.StatusCode) _
or objStatus.StatusCode<>0 Then
WScript.Echo "Computer did not respond."
Else
Wscript.Echo "Computer responded."
End If
Next


Работает. Но есть одна проблема. Мне надо проверять статус не одного , а около сотни ! компов. Вобщем задаю список IP адресов, заношу этот код в цикл, и по очереди пингую весь список, результат заношу в таблицу. Так вот , если комп не отвечает, то программка как бы подвисает , на несколько секунд, а если не отвечает подряд 10-20 машин , то создается впечатление что программка зависла, хотя это не так.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.03.2008 (Пт) 19:20

2vv
Хакер , поясните , почему нельзя использовать winsock и "мониторить" состояние порта, вместо пинга.

Да можно. Можно даже протокол ICQ приспособить. А на другой стороне поставить бота (бота тоже создать в рамках задачи определения доступности компов), который будет отвечать "Да тута я блин". И анализировать ответ.

Но может быть лучше использовать ICMP, изначально созданный для этих целей?

Работает. Но есть одна проблема. Мне надо проверять статус не одного , а около сотни ! компов. Вобщем задаю список IP адресов, заношу этот код в цикл, и по очереди пингую весь список, результат заношу в таблицу. Так вот , если комп не отвечает, то программка как бы подвисает , на несколько секунд, а если не отвечает подряд 10-20 машин , то создается впечатление что программка зависла, хотя это не так.

Программы не зависают. Зависание - мифический процесс, придуманный пользователями. Программы [не отвечают]. Не реагируют на сообщения. VB абстрагирует программиста от сообщений, переходя на уровень событий. Чтобы программа на VB реагировала на сообщения и вызывала соотв. события надо вызывать DoEvents тогда, когда требуется эта реакция. Где у тебя вызов DoEvents?

Кроме того, твой способ без DoEvents-а будет работать ничуть не лучше пинга.

Кроме того, крайне глупо заносить этот код в цикл. Надо занести список IP-адресов в запрос.

Кроме того, можно пинговать не через WMI.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

2vv
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 14.03.2008 (Пт) 17:36

Сообщение 2vv » 14.03.2008 (Пт) 19:49

Я то тоже больше склоняюсь к использованию ICMP. Иначе его бы и не было. Конечно находил и другие коды использующие icmp.dll напрямую.
Но приведенный пример самый простой .
Хакер не могли бы , пожалуйста , пояснить как занести список в запрос.
Можно так:

("Select * From Win32_PingStatus where Address ='192.168.1.1, 192.168.1.2, 192.168.1.2 и так далее'")
?
Повторюсь , уровень знаний очень низкий, разбираюсь по ходу.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.03.2008 (Пт) 19:51

... where Address = '192.168.1.1' or Address='192.168.1.2' or Address='127.0.0.1'

или

where Address in ('192.168.1.1', '192.168.1.2', '127.0.0.1')

последний вариант предпочтительнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

2vv
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 14.03.2008 (Пт) 17:36

Сообщение 2vv » 14.03.2008 (Пт) 19:59

Спасибо. Если я правильно понял, приемущество занесения адресов в список перед обработкой их в цикле - это то что будет сделан опрос всех сразу а не по очереди , правильно ? Только тогда сразу появляется вопрос , как узнать какой ответил ,какой нет ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.03.2008 (Пт) 20:30

В colPings у тебя ссылка на коллекцию, содержащую результат выполнения запроса. А следом - цикл, проходящийся по всем результатам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

2vv
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 14.03.2008 (Пт) 17:36

Сообщение 2vv » 14.03.2008 (Пт) 22:17

Понял. Что касается DoEvents , то это вряд-ли поможет. Дело в том что программка "перестает отвечать" пока не получит ответ на пинг от удаленного компа (функция objStatus.StatusCode). Если машина в сети , то ответ приходит быстро и "зависания" не происходит, а если машины в сети нет , то ответа ждем несколько секунд и на это время происходит "зависание" . DoEvents помог бы если бы цикл выполнялся долго, у тут не цикл выполняется долго , a функция. Вобщем я так предполагаю из иимеющихся у меня представлений. Если я не прав , поправьте. ?


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 104

    TopList