пытаюсь внедрить в свою программу проверку на чЁрные листы, например через dnsbl.sorbs.net, если писать в консоле host xxx.xxx.xxx.xxx.dnsbl.sorbs.net - то проверяеться нормально, через dig - тоже, написал прогу на с:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
typedef unsigned char uchar;
extern int h_errno;
char *getip(const char *hostname){
if(!hostname) return NULL;
struct hostent *ipaddr = gethostbyname(hostname);
if(!ipaddr) return NULL;
return ipaddr->h_addr_list[0];
}
int rbl_checkip(const char *hostname, const char *rbl){
if(!hostname || !rbl) return -1;
char *hostip = getip(hostname);
if(hostip){
char *rblhostname = (char*)malloc(18+strlen(rbl));
if(rblhostname){
sprintf(rblhostname, "%d.%d.%d.%d.%s", (uchar)hostip[3], (uchar)hostip[2], (uchar)hostip[1], (uchar)hostip[0], rbl);
fprintf(stderr, "rblhostname=%s\n", rblhostname);
char *rblip = getip(rblhostname);
free(rblhostname);
if(rblip){
printf("ip=%d.%d.%d.%d\n", (uchar)rblip[0], (uchar)rblip[1], (uchar)rblip[2], (uchar)rblip[3]);
printf("rezult=%d\n", (uchar)rblip[3]);
return 1;
}
printf("ok\n");
return h_errno==HOST_NOT_FOUND?0:-1;
}
return -1;
}
return h_errno==HOST_NOT_FOUND?1:-1;
}
int main(int argc, char *argv[]){
if(argc > 1) printf("rez=%d\n", rbl_checkip(argv[1], "dnsbl.sorbs.net"));
return 0;
}
тоже вроде работает, запускаю на другой машине - выдаЁт непонятный IP, хотя через host или dig - работает.
в чЁм я ошибся или есть альтернатива gethostbyname в си? и почему на одной машине работает на другой нет, железо одинаковое(x86_64) - операционка тоже(RHEL3)? но разный интернет.