On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
администратор




Пост N: 7376
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.06.21 15:22. Заголовок: Ping по IP адресу


Накопал исходничек. Но что то он не верно работает.
Забиваю IP который виндой не пингуется
А этот "сырец" вернет 0 , мол все в порядке.
Что нужно в нем подкрутить ?
 
? HB_PING( "81.214.12.12")
wait


#pragma BEGINDUMP

#include <hbapi.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <icmpapi.h>

int hb_Ping( const char * cp )
{
HANDLE hIcmpFile;
unsigned long ipaddr = INADDR_NONE; // corrected by KDJ
DWORD dwRetVal;
char SendData[32] = "Data Buffer";
LPVOID ReplyBuffer;
DWORD ReplySize;

if( isalpha( cp[0] ) ) //host address is a name
{
WSADATA wsaData;
int iResult;

iResult = WSAStartup( MAKEWORD(2, 2), &wsaData );

if( iResult == 0 )
{
struct hostent *remoteHost = gethostbyname( cp );

if( remoteHost != NULL )
ipaddr = *(unsigned long *) remoteHost->h_addr_list[0];

WSACleanup();
}
}
else
ipaddr = inet_addr( cp );

if (ipaddr == INADDR_NONE)
return 1;

hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE)
return 2;

ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*) malloc(ReplySize);
if (ReplyBuffer == NULL)
{
IcmpCloseHandle(hIcmpFile);
return 3;
}


dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000);

free(ReplyBuffer);

IcmpCloseHandle(hIcmpFile);

if (dwRetVal == 0)
return GetLastError();

return 0;

}

HB_FUNC( HB_PING )
{
hb_retni( hb_Ping( hb_parc( 1 ) ) );
}

#pragma ENDDUMP



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 15 [только новые]


администратор




Пост N: 7377
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.06.21 17:05. Заголовок: Пощупал и портировал..


Пощупал и портировал из Xharbour , HB_PING , там у них
свой родной есть.
Заменил в сырце ISCHAR на HB_ISCHAR , ISNUM на HB_ISNUM и добавил
пару-тройку Include , иначе не собиралось.
Работает нормально только 1 раз.
При повторном вызове и проверке того же IP или URL , всегда
возвращает .F.
Видимо что то не обнуляют они там.......

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4020
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.06.21 07:54. Заголовок: Если забить строку 2..


Если забить строку 224:

// sm_bAttemptedWinsock2Initialise = TRUE;

чтобы инициализация выполнялась каждый раз, начинает работать.

Почему так - не разбирался

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4021
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.06.21 08:59. Заголовок: Ага, там в конце hb_..


Ага, там в конце hb_ping выдается WSACleanup();
А при повторном вызове инициализация не выполняется. Наверное здесь собака порылась

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7378
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 10:29. Заголовок: Pasha пишет: Если з..


Pasha пишет:

 цитата:
Если забить строку 224:

// sm_bAttemptedWinsock2Initialise = TRUE;

чтобы инициализация выполнялась каждый раз, начинает работать.


Да так работает , спасибо

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7379
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 10:46. Заголовок: Pasha Там у них в с..


Pasha
Там у них в сырце живет
#include "inet.h"
Корректно вообще если я его дерну из Xharbour или что то другое можно прицепить ?
У меня MINGW

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7380
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 11:12. Заголовок: Dima пишет: #includ..


Dima пишет:

 цитата:
#include "inet.h"


Заменил его на hbsocket.h как вот тут пишут
https://github.com/vszakats/hb/blob/main/contrib/xhb/inet.h
Собралось и работает вроде но собиралось с ошибками.
Просто не обращать внимания на них или их можно как то избежать подправив сырец ?
Скрытый текст



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4022
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.06.21 14:50. Заголовок: Попробовал - у меня ..


Попробовал - у меня лезут другие ошибки
Но и с этими ошибками сборка не должна была завершиться успешно
Может быть там остался старый obj или exe с предыдущей сборки ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7381
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 15:21. Заголовок: Pasha пишет: Может ..


Pasha пишет:

 цитата:
Может быть там остался старый obj или exe с предыдущей сборки ?


Да ты прав.
Оставил в сырце вот так
#include "hbsocket.h" // добавил
#include "inet.h" // оставил от Xharbour
Собралось , работает.


А вот в первом сырце там в конце не нужен WSACleanup(); , хотя судя по коду если я верно
понял , когда чекается по IP адресу то WSAStartup вроде как и не используется

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7382
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 15:40. Заголовок: Dima пишет: IcmpC..


Dima пишет:

 цитата:

 
IcmpCloseHandle(hIcmpFile);

if (dwRetVal == 0)
return GetLastError();



Кстати на форуме FW , выглядит этот кусок вот так
 
IcmpCloseHandle(hIcmpFile);

if (dwRetVal == 0)
return 4;

И по ходу работает нормально на не живых IP

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7383
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 16:12. Заголовок: Dima пишет: HB_FUNC..


Dima пишет:

 цитата:
HB_FUNC( HB_PING )
{
hb_retni( hb_Ping( hb_parc( 1 ) ) );
}


Павел а как грамотно исправить что бы если возврат 0 то возвращало .T.
если не ноль то .F. ?
Я в сях ни чего не понимаю

Попробовал вот так и вроде даже работает
 
HB_FUNC( HB_PING )
{
BOOL LSuccess=FALSE;
int nSuccess;

nSuccess=hb_Ping( hb_parc( 1 ) );

if (nSuccess == 0)
LSuccess=TRUE;

hb_retl(LSuccess);
}



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4023
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.06.21 17:57. Заголовок: Dima пишет: Павел а..


Dima пишет:

 цитата:
Павел а как грамотно исправить что бы если возврат 0 то возвращало .T.
если не ноль то .F. ?



hb_retl( hb_Ping( hb_parc( 1 ) ) == 0 );

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4024
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.06.21 17:58. Заголовок: Dima пишет: Попробо..


Dima пишет:

 цитата:
Попробовал вот так и вроде даже работает



это в принципе тоже самое

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7384
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 18:02. Заголовок: Pasha пишет: hb_ret..


Pasha пишет:

 цитата:
hb_retl( hb_Ping( hb_parc( 1 ) ) == 0 );


Спасибо

А я "кучу" кода наколотил а оно вон как просто

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4025
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 03.06.21 18:07. Заголовок: Dima пишет: А вот в..


Dima пишет:

 цитата:
А вот в первом сырце там в конце не нужен WSACleanup(); , хотя судя по коду если я верно
понял , когда чекается по IP адресу то WSAStartup вроде как и не используется



Как я понимаю, WSAStartup() / WSACleanup() надо использовать парами, инициализация/деинициализация
Во время первой инициализации загружается winsock dll, во время последней деинициализации - выгружается

там еще через MAKEWORD(2, 2) передается номер версии winsock
а в HB_PING из xHb реальный косяк с деинициализацией, но вполне исправимый
Насчет использования inet.h в одном модуле вообще ничего смертельного нет, работает - и хорошо. Та просто нужные определения типов и макросов

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7385
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.06.21 18:13. Заголовок: Pasha пишет: там ещ..


Pasha пишет:

 цитата:
там еще через MAKEWORD(2, 2) передается номер версии winsock


Да про это я уже почитал в гугл. Я так понимаю правильное определение , учитывая что
у нас ниже Windows 7 ни у кого нет.

PS
Теперь у меня в копилке 2 разных и рабочих варианта PING.
Спасибо Павел !

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 248
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет