struct hostent {
char FAR * h_name;
char FAR * FAR * h_aliases;
short h_addrtype;
short h_length;
char FAR * FAR * h_addr_list;
};
Вопрос по gethostbyname
Код:
Написано, что h_addr_list - нультерминированный список адресов. В моем случает список IP-шек машины.
Запихиваю адреса в комбобокс
Код:
for(int ind=0;ind<10;ind++){
ip.IP = (int)hp->h_addr_list[ind];
ComboBox1->Items->Add(Format("%d.%d.%d.%d",ARRAYOFCONST((ip.a,ip.b,ip.c,ip.d))));
};
/*union IP{
int IP;
struct{
byte a,b,c,d;
};
};*/ - пояснение, что есть мой тип IP
ip.IP = (int)hp->h_addr_list[ind];
ComboBox1->Items->Add(Format("%d.%d.%d.%d",ARRAYOFCONST((ip.a,ip.b,ip.c,ip.d))));
};
/*union IP{
int IP;
struct{
byte a,b,c,d;
};
};*/ - пояснение, что есть мой тип IP
-- просто 10 адресов под ряд, не обращая внимания на конечный 0.0.0.0 ...
Вопрос: Мой комбобокс заполняется очень странно: т.е. у меня на компе 3 сетевых адаптера, а в комбобоксе сперва идет 3 непонятных абракадабры, потом 0.0.0.0 , и только потом 3 правильных апишника... Я полагал должно быть: Сперва 3 правильных апишника, потом 0.0.0.0, а потом уже что угодно............ Это так и должно быть или в чем дело?
Цитата:
Originally posted by Jump
Написано, что h_addr_list - нультерминированный список адресов. В моем случает список IP-шек машины.
Написано, что h_addr_list - нультерминированный список адресов. В моем случает список IP-шек машины.
написано также, что IP адреса возвращаються в структуру в сетевом порядке, т. е. старший байт по младшему адресу. IBM PC совместимые компьютеры хранят данные в виде младший байт по младшему вдресу. так что твои IP надо еще обработать функцией htonl, а уж потом запихивать куда угодно.
Цитата:
Originally posted by squirL
написано также, что IP адреса возвращаються в структуру в сетевом порядке, т. е. старший байт по младшему адресу. IBM PC совместимые компьютеры хранят данные в виде младший байт по младшему вдресу. так что твои IP надо еще обработать функцией htonl, а уж потом запихивать куда угодно.
написано также, что IP адреса возвращаються в структуру в сетевом порядке, т. е. старший байт по младшему адресу. IBM PC совместимые компьютеры хранят данные в виде младший байт по младшему вдресу. так что твои IP надо еще обработать функцией htonl, а уж потом запихивать куда угодно.
Ок, обработаем. Я так понимаю htonl развернет байты каждого адреса задом-наперед. Странно, я их и без этого вполне успешно использовал... Будет ли оно работать после применения функции... %)
А собственно по теме есть у кого пара драгоценных слов? :)
Почему эта "нультерминированность" такая кривая? Это везде так, или это у меня комп (или еще чего :) ) кривой?
У меня этот список выглядит вот так:
Т.е. сперва 3 непонятночего, потом нули, а потом (за нулями!!!) 3 моих адреса (последний немного потер от спамеров и т.п. типов), и далее опять идет непонятночто...
Закономерность на лицо, но КАКОГО ЧЕРТА?!!!!
Эт ж указатели :D :D :D :D :D
Надо было:
Код:
for(int ind=0; hp->h_addr_list[ind]!=0; ind++){
ip.IP = *(int*)hp->h_addr_list[ind];
ComboBox1->Items->Add(Format("%d.%d.%d.%d",ARRAYOFCONST((ip.a,ip.b,ip.c,ip.d))));
};
ip.IP = *(int*)hp->h_addr_list[ind];
ComboBox1->Items->Add(Format("%d.%d.%d.%d",ARRAYOFCONST((ip.a,ip.b,ip.c,ip.d))));
};
Это ж бубль-гум © :D :D :D :D
Код:
WSADATA wsaData;
char chInfo[64];
hostent *sh;
String LocalIP;
if (!WSAStartup(WINSOCK_VERSION, &wsaData))
{
if (!gethostname(chInfo,sizeof(chInfo)))
{
sh=gethostbyname((char*)&chInfo);
if (sh!=NULL)
{
int nAdapter = 0;
GroupBox3->Caption="Ñåòü. Âàø IP:";
while (sh->h_addr_list[nAdapter])
{
struct sockaddr_in adr;
memcpy(&adr.sin_addr,sh->h_addr_list[nAdapter],sh->h_length);
ListBox1->Items->Add(inet_ntoa(adr.sin_addr));
nAdapter++;
}
}
}
}
WSACleanup();
char chInfo[64];
hostent *sh;
String LocalIP;
if (!WSAStartup(WINSOCK_VERSION, &wsaData))
{
if (!gethostname(chInfo,sizeof(chInfo)))
{
sh=gethostbyname((char*)&chInfo);
if (sh!=NULL)
{
int nAdapter = 0;
GroupBox3->Caption="Ñåòü. Âàø IP:";
while (sh->h_addr_list[nAdapter])
{
struct sockaddr_in adr;
memcpy(&adr.sin_addr,sh->h_addr_list[nAdapter],sh->h_length);
ListBox1->Items->Add(inet_ntoa(adr.sin_addr));
nAdapter++;
}
}
}
}
WSACleanup();