Dns.GetHostEntry vs gethostbyaddr
От: Oleg_M  
Дата: 21.02.09 12:25
Оценка:
Добрый день.

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
);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.