public static IPHostEntry GetHostByAddr(IPAddress address) { // TODO #2891: Optimize this (or decide if this legacy code can be removed): int addressAsInt = unchecked ((int)address.GetAddress()); #if BIGENDIAN // TODO #2891: above code needs testing for BIGENDIAN. addressAsInt = (int)(((uint)addressAsInt << 24) | (((uint)addressAsInt & 0x0000FF00) << 8) | (((uint)addressAsInt >> 8) & 0x0000FF00) | ((uint)addressAsInt >> 24)); #endif IntPtr nativePointer = Interop.Winsock.gethostbyaddr( ref addressAsInt, Marshal.SizeOf <int>(), ProtocolFamily.InterNetwork); if (nativePointer != IntPtr.Zero) { return(NativeToHostEntry(nativePointer)); } throw new SocketException(); }
internal virtual NbtAddress[] GetHosts() { try { _waitResponse = false; byte[] bAddrBytes = laddr.GetAddressBytes(); for (int i = 1; i <= 254; i++) { NodeStatusRequest request; NodeStatusResponse response; byte[] addrBytes = { bAddrBytes[0], bAddrBytes[1], bAddrBytes[2], (byte)i }; IPAddress addr = new IPAddress(addrBytes); response = new NodeStatusResponse(new NbtAddress(NbtAddress.UnknownName, addr.GetAddress(), false, 0x20)); request = new NodeStatusRequest(new Name(NbtAddress.AnyHostsName, unchecked(0x20), null)); request.Addr = addr; Send(request, response, 0); } } catch (IOException ioe) { if (_log.Level > 1) { Runtime.PrintStackTrace(ioe, _log); } throw new UnknownHostException(ioe); } _autoResetWaitReceive = new AutoResetEvent(false); _thread = new Thread(this); _thread.SetDaemon(true); _thread.Start(); _autoResetWaitReceive.WaitOne(); List<NbtAddress> result = new List<NbtAddress>(); foreach (var key in _responseTable.Keys) { NodeStatusResponse resp = (NodeStatusResponse)_responseTable[key]; if (resp.Received && resp.ResultCode == 0) { foreach (var entry in resp.AddressArray) { if (entry.HostName.HexCode == 0x20) { result.Add(entry); } } } } _responseTable.Clear(); _waitResponse = true; return result.Count > 0 ? result.ToArray() : null; }
public static IPHostEntry GetHostByAddr(IPAddress address) { // TODO #2891: Optimize this (or decide if this legacy code can be removed): int addressAsInt = unchecked((int)address.GetAddress()); #if BIGENDIAN // TODO #2891: above code needs testing for BIGENDIAN. addressAsInt = (int)(((uint)addressAsInt << 24) | (((uint)addressAsInt & 0x0000FF00) << 8) | (((uint)addressAsInt >> 8) & 0x0000FF00) | ((uint)addressAsInt >> 24)); #endif IntPtr nativePointer = Interop.Winsock.gethostbyaddr( ref addressAsInt, Marshal.SizeOf<int>(), ProtocolFamily.InterNetwork); if (nativePointer != IntPtr.Zero) { return NativeToHostEntry(nativePointer); } throw new SocketException(); }