Форум » [x]Harbour » Валидность ввода IP адреса » Ответить

Валидность ввода IP адреса

Dima: Нет ли чего то готового что бы самопал не писать ? Ну что бы такие не верные адреса проверять: 123.234.1 DDD.145.1.1 555.345.456.123

Ответов - 8

PSP: IPv4 - не проблема написать самопал. Каждая из 4-х частей - число от 0 до 255. Этого, имхо, достаточно. А вот IPv6... :)

Dima: PSP пишет: IPv4 - не проблема написать самопал Так и сделаю :)

Andrey: Смотри примеры в :\MiniGUI\SAMPLES\BASIC\IPADDRESS


Dima: Наваял на скорую вот такой исходничек по проверке IP адреса. [pre2] Func isValidIPadress(Cip) local ret:=.t. local n n:=numtoken(Cip,".") if n#4 return .f. endif For n=1 to 4 if !isdigit(token(Cip,".",n)) return .f. endif if val(token(Cip,".",n))<0 .or. val(token(Cip,".",n))>255 return .f. endif Next return ret [/pre2] Что скажете ? PS Если можно проще сделать покажите как.

santy: Можна попробовать С вариант (3 функции): [pre2] //#include "hmg.ch" REQUEST HB_GT_WIN_DEFAULT Function main() Local dd:= "192.168.22.322" dd1:="192.168.22.122" if (VALIDADDRESS(dd) == 1) ? "true" else ? "false" endif if (ISVALIDIPADDRESS(dd1) < 0) ? "false" else ? "true" endif wait Return .T. #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( VALIDADDRESS ) { int _retData = 1; const char * address = (const char*) hb_parc( 1 ); if (address == NULL || address == '\0') hb_retni((int) 0); int nibble, octets = 0, flag = 0;; char* holder = (char*)malloc(strlen(address)+1); strcpy(holder, address); char* byte = strtok(holder, "."); while(byte != NULL) { octets++; if (octets > 4) { flag = 1; break; } nibble = atoi(byte); if ((nibble < 0) || (nibble > 255)) { flag = 1; break; } byte = strtok(NULL, "."); } free(holder); if(flag || octets < 4) hb_retni((int) 0); else hb_retni((int) 1); } /* int isValidIpAddress_c(const char *ipAddress) { struct sockaddr_in sa; return inet_pton(AF_INET, ipAddress, &(sa.sin_addr)); } */ HB_FUNC( ISVALIDIPADDRESS) { register const char* pos = (const char*) hb_parc( 1 ); register unsigned char ch = *pos; register unsigned short count = 0; if (NULL == pos) hb_retni((int) 0); while (ch != NULL) { if (!((ch >= '0' && ch <= '9') || ch == '.')) hb_retni((int) 0); if (ch == '.') if (++count > 3) hb_retni((int) 0); ch = *++pos; } if (count == 3 && *--pos != '.') hb_retni((int) 1); hb_retni((int) 0); } #pragma ENDDUMP [/pre2] Функция isValidIpAddress работает но не на всех компиляторах.

Dima: santy пишет: Функция isValidIpAddress работает но не на всех компиляторах Да сработало на MINGW. Спасибо за еще один вариант проверки.

santy: santy пишет: /* int isValidIpAddress_c(const char *ipAddress) { struct sockaddr_in sa; return inet_pton(AF_INET, ipAddress, &(sa.sin_addr)); } */ Я имел ввиду вот эту функцию. Дима попробуйте у себя может пройдёт. НЕ у всех есть inet_pton.

Dima: santy пишет: Я имел ввиду вот эту функцию Да с ней не собирается.



полная версия страницы