powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / IP problem
25 сообщений из 41, страница 1 из 2
IP problem
    #33768422
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция, возвращает IP удаленного компа по его имени в домене. Ведет себя крайне странно: для одних компов возвращает нормальный IP (в не зависимости от того динамический он или нет), а для других возвращает несуществующие IP, при чем чаще те, которые статические.

CString GetIPAddress(CString pcName)
{
//----------------------------------------получить IP адрес компьютера
CString str;
HOSTENT* pHost;
pHost = gethostbyname(pcName);
if(pHost == NULL)
return "";
else
{
char szBuff[80];
if(pHost->h_addr_list[0] != NULL)
{
sprintf(szBuff, "%u.%u.%u.%u", (unsigned char) pHost->h_addr_list[0][0],
(unsigned char) pHost->h_addr_list[0][1],
(unsigned char) pHost->h_addr_list[0][2],
(unsigned char) pHost->h_addr_list[0][3]);
str = szBuff;
return str;
}
else
return "";
}
return "";
}

Что не так?

--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
IP problem
    #33768425
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь - был напуган

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CString GetIPAddress(CString pcName)
{
//----------------------------------------получить IP адрес компьютера
	CString  str;
	HOSTENT* pHost;
pHost = gethostbyname(pcName);
	if(pHost == NULL)
		return "";
	else
	{
		char szBuff[ 80 ];
		if(pHost->h_addr_list[ 0 ] != NULL)
		{
			sprintf(szBuff, "%u.%u.%u.%u", (unsigned char) pHost->h_addr_list[ 0 ][ 0 ],
										   (unsigned char) pHost->h_addr_list[ 0 ][ 1 ],
										   (unsigned char) pHost->h_addr_list[ 0 ][ 2 ],
										   (unsigned char) pHost->h_addr_list[ 0 ][ 3 ]);
			str = szBuff;
			return str;
		}
		else
			return "";
	}
	return "";
}
...
Рейтинг: 0 / 0
IP problem
    #33768499
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первая мысль, которая приходит в голову - это проверить для неправельных адресов, сколько их вообще в списке и какие.

А также снять дамп пакетов и посмотреть, кто врет - сеть или С
...
Рейтинг: 0 / 0
IP problem
    #33768517
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы для начала написал
Код: plaintext
1.
szBuff[ 0 ] =  0 ;
...
Рейтинг: 0 / 0
IP problem
    #33768528
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плизззз, не понял.
...
Рейтинг: 0 / 0
IP problem
    #33768602
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что удалось нарыть

автор
SYMPTOMS
On a Microsoft Windows Server 2003-based computer that has multiple IP addresses, the GetHostByName function does not return IP addresses in the correct order. The first IP address that is returned is the one with the lowest number instead of the primary IP address. Because the ping command uses GetHostByName to resolve a name, you will also see this behavior if you use this command.
CAUSE
This problem is caused by a code defect in the Iphlpapi.dll file.
RESOLUTION
Service pack information
To resolve this problem, obtain the latest service pack for Windows Server 2003. For more information, click the following article number to view the article in the Microsoft Knowledge Base:
889100 How to obtain the latest service pack for Windows Server 2003

однако, залез на контроллер домена и в DHCP и в DNS неправильный адрес принадлежит другому компьютеру!
Однако винда нормально обрабатывает копирование и т.д. с этим компом.
???
--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
IP problem
    #33768615
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще лучше memset(szBuff,0,sizeof(szBuff))
...
Рейтинг: 0 / 0
IP problem
    #33768619
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а точно, там же список адресов, в HOSTENT-е-то
...
Рейтинг: 0 / 0
IP problem
    #33768640
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--а точно, там же список адресов, в HOSTENT-е-то
как узнать сколько их, чтобы проверить (еще вопрос: а как их проверять)
...
Рейтинг: 0 / 0
IP problem
    #33769133
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У кого-нибудь есть пример использования GetAddressByName, че-то в MSDN нихрена не нашел? Какие параметры нужно для сети с DNS и TCP-протокола?

--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
IP problem
    #33769148
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возвращается Zero-terminated список
вот как вытаскивать все адреса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	 char szBuff[ 80 ];
	 memset(szBuff, 0 ,sizeof(szBuff));


int i= 0 ;
while(pHost->h_addr_list[i])
{
sprintf(szBuff, "%u.%u.%u.%u", (unsigned char) pHost->h_addr_list[i][ 0 ],
							   (unsigned char) pHost->h_addr_list[i][ 1 ],
										   (unsigned char) pHost->h_addr_list[i][ 2 ],
										   (unsigned char) pHost->h_addr_list[i][ 3 ]);

i++;
puts(szBuff);
}
...
Рейтинг: 0 / 0
IP problem
    #33769159
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--возвращается Zero-terminated список
вот как вытаскивать все адреса
}[/src]
понятно, спасибо, но как я понял меня это не спасет. Пробовал ставить не 0, другие индексы, так он вообще не возвращает ни какого адреса!
...
Рейтинг: 0 / 0
IP problem
    #33769183
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте скажем для www.microsoft.com или www.msdn.com
он вернет как раз список адресов.
Правда они все коректные - так прописано в DNS специально

Как раз этот код поможет узнать, больше ли одного адреса
...
Рейтинг: 0 / 0
IP problem
    #33769290
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовал твой вариант, везде в моей сети одинарные IP.
Как же интересно винда видит тот комп по сети и другие проги тоже, RAdmin, если задать ему по имени компа, тоже не найдет, а NetOp в легкую. Подозреваю, что используют функции более высокого уровня.

--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
IP problem
    #33769379
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я предполагаю, что gethostbyname использует традиционный резолвинг (файл hosts, DNS), а винда - все в комплексе, то есть плюс свои фичи - броадкастинг, WINS, lmhosts и что там она еще умеет. Наверное, из-за этого.

Поэтому возможно GetAddressByName действительно более интересный путь
...
Рейтинг: 0 / 0
IP problem
    #33769430
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--
Поэтому возможно GetAddressByName действительно более интересный путь
Блин, найти бы еще нормальное описание с примером...
...
Рейтинг: 0 / 0
IP problem
    #33769662
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя нет, я ошибся - похоже, gethostbyname в виндах умеет и броадкастом резолвить. Обычные netbios имена можно скармливать, которых в DNS точно нету.
...
Рейтинг: 0 / 0
IP problem
    #33769734
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--хотя нет, я ошибся - похоже, gethostbyname в виндах умеет и броадкастом резолвить. Обычные netbios имена можно скармливать, которых в DNS точно нету.

а файл hosts (если не попутал) пустой в системе ? а то может такого наковырять...древнего :)


с уважением
(круглый)
...
Рейтинг: 0 / 0
IP problem
    #33769766
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В линуксе есть еще такая функция, но найти опсания не могу

Код: plaintext
1.
2.
3.
struct hostent *gethostbyname2(const char *name, int af);

В glibc2 имеется также функция gethostbyname2() работающая как gethostbyname(), но позволяющая обозначать семейство, к которому должен принадлежать адрес.

Может ли она броадкасты кидать?
...
Рейтинг: 0 / 0
IP problem
    #33769767
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример можно найти на rsdn
Например вот
...
Рейтинг: 0 / 0
IP problem
    #33769848
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 --null--хотя нет, я ошибся - похоже, gethostbyname в виндах умеет и броадкастом резолвить. Обычные netbios имена можно скармливать, которых в DNS точно нету.

а файл hosts (если не попутал) пустой в системе ? а то может такого наковырять...древнего :)


с уважением
(круглый)

kolobok0, нет, этот вариант я сразу проверил :-)
Видимо в винде оно обращается к системному виндовому резолверу, а он как известно умеет броадкастами.


AkhМожет ли она броадкасты кидать?
нет, думаю , все зависит от реализации резолвера - linux не кидает броадкасты, как виндовые сервисы. Если на ней нет smb клиента.
...
Рейтинг: 0 / 0
IP problem
    #33769868
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null-- AkhМожет ли она броадкасты кидать?
нет, думаю , все зависит от реализации резолвера - linux не кидает броадкасты, как виндовые сервисы. Если на ней нет smb клиента.

Раньше меня этот вопрос тоже интересовал, но так до сути не успел докопаться.

В системе определяется в какой последовательности разрешаются имена /etc/host.conf. Нашел, что еще может быть параметр nis. Что это такое не понял, но разрешать имена он не захотел.

Так каким алгоритмом пользуется функция gethostbyname? Ядра, какими-то системными возможностями или сама его реализует?
...
Рейтинг: 0 / 0
IP problem
    #33769911
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh да, помню Ваш топик в линуховой ветке.


nis - это Yellow Pages, Network Information System сановская, по ней тоже можно резолвить
если она в сети настроена

да, во фре/линухе /etc/host.conf. В соляре другой файлик.
В винде последовательность для netbios тоже поеделяется, есть узлы вида B,P, M, H - по приоритету использовавния wins или броадкастов.

В доках написано, как именно винда резолвит (последовательность), используя
файлы, dns и netbios

gethostbyname - я так понимаю, резолвер встроен я ядро у юниксов как и сокеты. а в винде - в winsock, но он еще и пользуется netbios-ом.

Ибо работает приведенный код по netbios имени, а так же всякие утилиты типа ping и прочих. Они должны юзать обычный gethostbyname
...
Рейтинг: 0 / 0
IP problem
    #33770036
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maksim UMПример можно найти на rsdn
Например вот
это не та
...
Рейтинг: 0 / 0
IP problem
    #33771540
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up


--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / IP problem
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]