Добрый день.
C#.Net FrameWork 2.0
Приложение — по сути своей TCP-mapper, с обработкой проходящего TCP-потока.
Dns.BeginGetHostEntry (как и Dns.GetHostEntry) успешно работает в локальной
сети (возвращает DNS-имя) только если компьютер из того же домена. Если
попытаться определить имя компа из рабочей группы, то выдается исключение
"No such host is known".
В тоже самое время, если сделать проcтенький тестовый проект на С++,
gethostbyaddr легко выдает имя любого компа и из домена и из рабочей группы.
Чтение MSDN показало, что во-первых, gethostbyaddr объявлена deprecated и
рекомендуется использование getnameinfo.
В тоже самое время указывается, что getnameinfo возвращет NetBIOS name, а
getnameinfo — DNS name.
Я бы хотел в своем приложении на C# реализовать возможность запроса NetBIOS
name, если DNS name получить неудалось.
Ок, я подключил к своему mаnаged приложению специально написанную (на С++)
unmanaged-dll, в которой я вызываю gethostbyaddr
В ответ получаю ошибку WSAEINTR.
Вопрос 1
Возможно ли получение NetBIOS name "встроенными" классами .Net FrameWork ?
Если ответ на первый вопрос — отрицательный, то
Вопрос 2
Почему (и как это обойти) возникает WSAEINTR ?
int GetHostNameByIP (const byte *pb_IP, const long l_IPLen, char
*pc_HostName, int i_HostNameSize)
{
hostent* remoteHost = gethostbyaddr((char *) &pb_IP, l_IPLen, AF_INET);
if (remoteHost == NULL)
return WSAGetLastError();
strcpy_s(pc_HostName, i_HostNameSize, remoteHost->h_name);
return 0;
}
[DllImport(sDLLPath, CharSet = CharSet.Auto, SetLastError = true)]
public static extern Int32 GetHostNameByIP ( byte[] ab_IP
, Int32 l_IPLen
, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder sb_HostName
, Int32 i_HostNameSize
);