purebasic.info

PureBasic forum
Текущее время: Ср май 23, 2018 5:51 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: ICMP-ping
СообщениеДобавлено: Вс май 13, 2018 6:43 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 402
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Всем, привет.
Потребовалось пинговать ПК (по-науке). Нашёл следующий код на зарубежном форуме:
Код:
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
EnableExplicit
 
InitNetwork()
 
Global EchoMessage.s = "MVPing make a Ping Test"
 
Procedure Ping(valeur)
 
  Protected sIPAddress.s
  Protected IPAddress.l
  Protected lngResult.l
  Protected ReplyBuffer.s
  Protected hIcmpFile.i, dwRetVal.i, *Echo.ICMP_ECHO_REPLY
  Protected *IPBuffer
 
  Repeat
    sIPAddress = GetGadgetText(3)
   
    *IPBuffer = AllocateMemory(StringByteLength(sIPAddress, #PB_Ascii) + Len(EchoMessage))
    If *IPBuffer
      PokeS(*IPBuffer, sIPAddress, -1, #PB_Ascii)
    EndIf
   
    Debug PeekS(*IPBuffer)
   
   
    ReplyBuffer = Space(SizeOf(ICMP_ECHO_REPLY) + StringByteLength(EchoMessage))
    hIcmpFile = IcmpCreateFile_()
    dwRetVal = IcmpSendEcho_(hIcmpFile, inet_addr_(*IPBuffer), @EchoMessage, StringByteLength(EchoMessage), #Null, @ReplyBuffer, StringByteLength(ReplyBuffer) + SizeOf(ICMP_ECHO_REPLY), 1000)
    IcmpCloseHandle_(hIcmpFile)
    *Echo = @ReplyBuffer
   
    If (*Echo\DataSize) > 0 ; ping ok
      SetGadgetColor(3,#PB_Gadget_BackColor,RGB(0,255,0))
    Else ; no ping
      SetGadgetColor(3,#PB_Gadget_BackColor,RGB(255,0,0))
    EndIf
    Delay(1000)
  ForEver
 
EndProcedure
 
 
Define Event.i
 
If OpenWindow(0, 245, 73, 295, 175, "Wake on Lan", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  StringGadget(3, 100, 10, 190, 20, "192.168.1.2")
 
  CreateThread(@ping(),1)
 
  Repeat
    Event = WaitWindowEvent()
    Delay(10)
  Until Event = #PB_Event_CloseWindow
EndIf



запускаю его в среде PB5.61. Она, как известно, только в unicod'e работает. Автор кода (infratec), пишет что api-функция ожидает ASCII-строку. Собственно так она и записывается в *IPBuffer. Вопрос: почему данный код нормально работает из под отладчика, но категорически отказывается работать в скомпилированном виде (всегда o.k.)?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Вс май 13, 2018 7:14 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6276
Благодарил (а): 19 раз.
Поблагодарили: 184 раз.
Пункты репутации: 48
У меня работает в скомпилированном виде.
Вот код вроде попроще. Тоже работает:
Цитата:
EnableExplicit

; Send ICMP request to given IP
; RETURN: value in ms on success, -1 else
Procedure Ping(IPv4.l, TimeOut=1000)
Protected hFile = IcmpCreateFile_()
Protected Res
Protected *Out.ICMP_ECHO_REPLY = AllocateMemory(SizeOf(ICMP_ECHO_REPLY) + 32)
If IcmpSendEcho_(hFile, IPv4, "@Echo this stuff", 32, 0, *Out, MemorySize(*Out), TimeOut)
Res = *Out\RoundTripTime
Else
Res = -1
EndIf
IcmpCloseHandle_(hFile)
FreeMemory(*Out)

ProcedureReturn Res
EndProcedure


; ping google DNS server
Debug Ping(MakeIPAddress(192,168,1,1))

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Вс май 13, 2018 7:25 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 402
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
kvitaliy, спасибо.
Понятно что код "побился" по дороге, поэтому заменил все *|/2/>Out на *Out.
Всё равно всегда получаю -1 в ответ. Хотя из виндовой консоли всё пингуется нормально.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Вс май 13, 2018 7:36 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6276
Благодарил (а): 19 раз.
Поблагодарили: 184 раз.
Пункты репутации: 48
knower писал(а):

Понятно что код "побился" по дороге, поэтому заменил все *|/2/>Out на *Out.
Всё равно всегда получаю -1 в ответ. Хотя из виндовой консоли всё пингуется нормально.

Это подсветка кода чудит. Выключил её.

Странно. Может особенность конкретной Винды? У меня win7, оба кода работают как надо, скажем 192,168,1,1 пингуется, а 192,168,1,2 - нет его.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Вс май 13, 2018 7:44 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 402
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Тоже использую win7 32-х разрядную. Но почему-то работает только когда запускаешь из среды (только 1й код). Может кто-нибудь ещё потестит (проверит у себя) и отпишется здесь?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Вс май 13, 2018 9:40 pm 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 144
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Win7x64, PB5.60х64 (нету 61-го) - код работает и скомпиленый и в отладчике.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Пн май 14, 2018 4:02 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 402
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
КЭС и kvitaliy, может тогда выложите exe-шник? Чтобы исключить/подтвердить особенность Wind'ы. Надеюсь, что не прошу ничего сверестественного. Попробую запустить его у себя, но уже только вечером.
Честно говоря немного смущает это: Len(EchoMessage)
Не должно ли быть так: StringByteLength(EchoMessage, #PB_Ascii)?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Пн май 14, 2018 4:48 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6276
Благодарил (а): 19 раз.
Поблагодарили: 184 раз.
Пункты репутации: 48
exe


Вложения:
ping.zip [22.68 KiB]
Скачиваний: 5

_________________
read-only
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Пн май 14, 2018 10:22 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11130
Благодарил (а): 4 раз.
Поблагодарили: 399 раз.
Оба кода работают в 5.62.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ICMP-ping
СообщениеДобавлено: Пн май 14, 2018 3:38 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 402
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Пётр, спасибо за ещё один авторитетный тест/вывод.
kvitaliy, спасибо за бинарник. В итоге картина та же. Что ни вбей - постоянно o.k. (зелёная строка). Значит система. Эх...


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB