Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2015, 07:18   #1
Kurbetsoft
 
Аватар для Kurbetsoft
 
Регистрация: 28.09.2015
Сообщений: 3
По умолчанию Сетевое имя и группа иногда меняются местами

Здравствуйте!

Подскажите может кто сталкивался, почему иногда при определении по IP-адресу сетевого имени и группы они меняются местами. Закономерность выявить не удалось. Эта проблема появилась начиная с Windows 7, в ранних версиях такого не было. Т.е. если определяемый хост на Windows 7 и выше, то иногда возникает такой глюк. Если же XP и ниже, то никогда.

Код:
int getNMBName(int ip, char *machine, char *workgroup)
{
	struct sockaddr_in sin_dst;
	struct nmbhdr *nmb;
	struct typez *typz;
	char *data;	
	char buffer[1024];
	int is_ok=0;

	SOCKET socket_client;

	int i;
	int longueur = sizeof (struct sockaddr_in);
	int count;

	struct _nameinfo
	{
		char name[15];
		char type;
		char res;
		char fill;
	}*ninf;

	fd_set rfds;
	
	memset(buffer, 0, 1024);
	nmb = (struct nmbhdr *) buffer;
	data = (char *) (buffer + NMBHDRSIZE);
	typz = (struct typez *) (buffer + NMBHDRSIZE + 33);
	
	memcpy (data, "CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 34);

	nmb->id = 0x600;
	nmb->R = 0;				
	nmb->opcode = 0;			
	nmb->que_num = htons (1);	
	nmb->namelen = 0x20;
	typz->type = 0x2100;
	typz->type2 = 0x0100;

	memset(&sin_dst,0,sizeof(sockaddr_in));
	sin_dst.sin_family = AF_INET;
	sin_dst.sin_port = htons (137);
	sin_dst.sin_addr.s_addr = ip;

	socket_client = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	
	unsigned long off=0;
	unsigned long on=1;
	ioctlsocket(socket_client,FIONBIO,&on);

	sendto (socket_client, buffer, 50, 0, (struct sockaddr *) &sin_dst,sizeof (sockaddr_in));

	FD_ZERO (&rfds);
	FD_SET (socket_client, &rfds);
	memset(buffer, 0, 1024);
	nmb = (struct nmbhdr *) (buffer);
	
	machine[0]='\0';
	if(workgroup!=NULL)workgroup[0]='\0';

	if(select (1,&rfds,0,0,&scanTimeout)>0 && FD_ISSET (socket_client,&rfds))
	{
		if(recvfrom(socket_client, buffer, sizeof (buffer), 0,(struct sockaddr *) &sin_dst, (int *) & longueur) != -1)
		{
			if(nmb->rep_num != 0)
			{
				count = 0;
				ninf =(struct _nameinfo *) (buffer + 57 +(count++ * sizeof (struct _nameinfo)));
				while ((machine[0] == '\0') && (57 + (count * sizeof (struct _nameinfo)) < 1024))
				{
					if (ninf->type == 0)
					{
						i = 0;
						while ((i < 15))
						{
							machine[i] = ninf->name[i];
							i++;
						}
						machine[i] = '\0';
						trim (machine);
					}
					ninf =(struct _nameinfo *) (buffer + 57 +(count++ *sizeof (struct _nameinfo)));
				}
				if(machine[0]!='\0')
				{
					OemToChar(machine,machine);
					if(workgroup!=NULL)
					{
						int k;
						while ((workgroup[0] == '\0') && (57 + (count * sizeof (struct _nameinfo)) < 1024))
						{
							if(ninf->type == 0)
							{
								k = 0;
								while ((k < 15))
								{
									workgroup[k] = ninf->name[k];
									k++;
								}
								workgroup[k] = '\0';
								trim (workgroup);
							}
							ninf =(struct _nameinfo *) (buffer + 57 +(count++ * sizeof (struct _nameinfo)));
						}	
						OemToChar(workgroup,workgroup);
					}
					is_ok=1;
				}
			}
		}
	}

	ioctlsocket(socket_client,FIONBIO,&off);
	shutdown(socket_client,2);
	closesocket (socket_client);
	return is_ok;
}
В результате имеем в machine - сетевое имя, в workgroup - группа.
При глюке, соответственно наоборот.

P.S. Хочу пофиксить этот глюк в NetLook 3.11.
WBR, Alexander Kurbet
Kurbetsoft вне форума Ответить с цитированием
Старый 28.09.2015, 09:17   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Я особо не вникал, но похоже что имена берутся из ninf а ninf берется из buffer а buffer приходит из сети через recvfrom. Отсюда вопрос - а там точно все в правильном порядке приходит?

PS.
Код ужасен.
waleri вне форума Ответить с цитированием
Старый 28.09.2015, 13:11   #3
Kurbetsoft
 
Аватар для Kurbetsoft
 
Регистрация: 28.09.2015
Сообщений: 3
По умолчанию

Так в этом и вопрос, до появления Windows 7 всегда все было на своих местах, после стало иногда менять местами, без явной закономерности и достаточно редко, но все же, такое поведение имеет место быть. По какой причине может приходить в другом порядке, непонято. И в NETBIOS Name Service вряд ли что-то поменялось, хотя...
WBR, Alexander Kurbet

Последний раз редактировалось Kurbetsoft; 28.09.2015 в 13:23.
Kurbetsoft вне форума Ответить с цитированием
Старый 28.09.2015, 13:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
По какой причине может приходить в другом порядке
Мне отсюда плохо видно: Ты склейку пакетов учел?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2015, 13:39   #5
Kurbetsoft
 
Аватар для Kurbetsoft
 
Регистрация: 28.09.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мне отсюда плохо видно: Ты склейку пакетов учел?
Разве может из-за этого путаться порядок, ответ как бы одним пакетом идет. Но вообще сам думал в этом направлении, проблема в том что не всегда удается воспроизвести подобное поведение, чтобы как следует его проанализировать. Спрашивал, может тут кто просто сталкивался с таким и нашел решение. Буду копать дальше...
WBR, Alexander Kurbet
Kurbetsoft вне форума Ответить с цитированием
Старый 28.09.2015, 15:08   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Разве может из-за этого путаться порядок, ответ как бы одним пакетом идет.
О-о-о...! еще как может ))
склейка - тот еще бич. Олд бич
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2015, 15:35   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Поставьте WireShark, залогируйте трафик, потом смотрите на данные в пакете...
waleri вне форума Ответить с цитированием
Старый 28.09.2015, 15:41   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Kurbetsoft Посмотреть сообщение
Разве может из-за этого путаться порядок, ответ как бы одним пакетом идет. Но вообще сам думал в этом направлении, проблема в том что не всегда удается воспроизвести подобное поведение, чтобы как следует его проанализировать. Спрашивал, может тут кто просто сталкивался с таким и нашел решение. Буду копать дальше...
в UDP может спокойно.
зависит от того как датаграммы проходят трафик, они могу и по кускам пойти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2015, 16:41   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Насколько я вижу код, считывается один UDP пакет, так что порядок едва ли имеет значение. Сам пакет тоже может фрагментироваться, но система соберет его в нужном порядке.
Мне кажется, что в самом пакете данные меняются местами.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Группа=Группа, Имя=Имя Nurik1991 Microsoft Office Access 1 22.10.2013 13:27
С++ фигуры меняются darkness2 Помощь студентам 1 03.06.2013 16:55
Меняются наименования xxxxx0111 Microsoft Office Excel 3 17.02.2010 22:36
Не меняются скины sSkinManager Mishina Общие вопросы Delphi 1 17.06.2008 08:59