Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / IP problem / 25 сообщений из 41, страница 1 из 2
02.06.2006, 12:39
    #33768422
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
Есть функция, возвращает 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
02.06.2006, 12:40
    #33768425
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
Извиняюсь - был напуган

Код: 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
02.06.2006, 12:58
    #33768499
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
Первая мысль, которая приходит в голову - это проверить для неправельных адресов, сколько их вообще в списке и какие.

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

автор
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
02.06.2006, 13:26
    #33768615
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
а еще лучше memset(szBuff,0,sizeof(szBuff))
...
Рейтинг: 0 / 0
02.06.2006, 13:28
    #33768619
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
а точно, там же список адресов, в HOSTENT-е-то
...
Рейтинг: 0 / 0
02.06.2006, 13:32
    #33768640
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
--null--а точно, там же список адресов, в HOSTENT-е-то
как узнать сколько их, чтобы проверить (еще вопрос: а как их проверять)
...
Рейтинг: 0 / 0
02.06.2006, 15:42
    #33769133
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
У кого-нибудь есть пример использования GetAddressByName, че-то в MSDN нихрена не нашел? Какие параметры нужно для сети с DNS и TCP-протокола?

--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
02.06.2006, 15:45
    #33769148
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
возвращается 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
02.06.2006, 15:47
    #33769159
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
--null--возвращается Zero-terminated список
вот как вытаскивать все адреса
}[/src]
понятно, спасибо, но как я понял меня это не спасет. Пробовал ставить не 0, другие индексы, так он вообще не возвращает ни какого адреса!
...
Рейтинг: 0 / 0
02.06.2006, 15:51
    #33769183
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
попробуйте скажем для www.microsoft.com или www.msdn.com
он вернет как раз список адресов.
Правда они все коректные - так прописано в DNS специально

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

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

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

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


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

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

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

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

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


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

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


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

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

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

Так каким алгоритмом пользуется функция gethostbyname? Ядра, какими-то системными возможностями или сама его реализует?
...
Рейтинг: 0 / 0
02.06.2006, 18:37
    #33769911
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
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
02.06.2006, 20:35
    #33770036
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
Maksim UMПример можно найти на rsdn
Например вот
это не та
...
Рейтинг: 0 / 0
05.06.2006, 09:28
    #33771540
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IP problem
up


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


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