/// <exception cref="System.IO.IOException"></exception> internal virtual void EnsureOpen(int timeout) { _closeTimeout = 0; if (SoTimeout != 0) { _closeTimeout = Math.Max(SoTimeout, timeout); } // If socket is still good, the new closeTimeout will // be ignored; see tryClose comment. if (_socket == null) { _socket = new SocketEx(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //IPAddress.`Address` property deleted //_socket.Bind(new IPEndPoint(laddr.Address, _lport)); _socket.Bind(new IPEndPoint(laddr, _lport)); if (_waitResponse) { _thread = new Thread(this); //new Sharpen.Thread(this, "JCIFS-NameServiceClient"); _thread.SetDaemon(true); _thread.Start(); } } }
public virtual void Run() { int nameTrnId; NameServicePacket response; try { while (_thread == Thread.CurrentThread()) { _socket.SoTimeOut = _closeTimeout; int len = _socket.Receive(_rcvBuf, 0, RcvBufSize); if (_log.Level > 3) { _log.WriteLine("NetBIOS: new data read from socket"); } nameTrnId = NameServicePacket.ReadNameTrnId(_rcvBuf, 0); response = (NameServicePacket)_responseTable.Get(nameTrnId); if (response == null || response.Received) { continue; } lock (response) { response.ReadWireFormat(_rcvBuf, 0); if (_log.Level > 3) { _log.WriteLine(response); Hexdump.ToHexdump(_log, _rcvBuf, 0, len); } if (response.IsResponse) { response.Received = true; Runtime.Notify(response); } } } } catch (TimeoutException) { } catch (Exception ex) { if (_log.Level > 2) { Runtime.PrintStackTrace(ex, _log); } } finally { TryClose(); } }
/// <exception cref="System.IO.IOException"></exception> internal virtual void EnsureOpen(int timeout) { //Log.Out($"NameServiceClient.EnsureOpen"); _closeTimeout = 0; if (SoTimeout != 0) { _closeTimeout = Math.Max(SoTimeout, timeout); } var localPort = (SmbConstants.Lport == 0) ? _lport : SmbConstants.Lport; // If socket is still good, the new closeTimeout will // be ignored; see tryClose comment. if ( _socketSender == null || _socketSender.LocalEndPoint == null || _socketSender.GetLocalPort() != localPort || !IPAddress.Any.Equals(_socketSender.GetLocalInetAddress()) ) { if (_socketSender != null) { _socketSender.Dispose(); _socketSender = null; } _socketSender = new SocketEx(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _socketSender.Bind(new IPEndPoint(IPAddress.Any, localPort)); if (_waitResponse) { if (_thread != null) { _thread.Cancel(true); _thread.Dispose(); } _thread = new Thread(this); _thread.SetDaemon(true); _thread.Start(true); } } }
internal virtual void TryClose() { lock (_lock) { if (_socket != null) { _socket.Dispose(); _socket = null; } _thread = null; if (_waitResponse) { _responseTable.Clear(); } else { _autoResetWaitReceive.Set(); } } }
internal virtual void TryClose() { //Log.Out("NameSerciceClient.TryClose"); if (this._isActive) { //Log.Out("NameSerciceClient.TryClose - Now in Processing... Exit."); return; } lock (_lock) { if (_socketSender != null) { _socketSender.Dispose(); _socketSender = null; //Log.Out("NameSerciceClient.TryClose - _socketSender.Disposed"); } if (_thread != null) { _thread.Cancel(true); _thread.Dispose(); _thread = null; //Log.Out("NameSerciceClient.TryClose - _thread.Aborted"); } if (_waitResponse) { _responseTable.Clear(); } else { _autoResetWaitReceive.Set(); } } }
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; }
/// <exception cref="System.IO.IOException"></exception> internal virtual void EnsureOpen(int timeout) { _closeTimeout = 0; if (SoTimeout != 0) { _closeTimeout = Math.Max(SoTimeout, timeout); } // If socket is still good, the new closeTimeout will // be ignored; see tryClose comment. if (_socket == null) { _socket = new SocketEx(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _socket.Bind(new IPEndPoint(laddr, _lport)); if (_waitResponse) { _thread = new Thread(this); //new Sharpen.Thread(this, "JCIFS-NameServiceClient"); _thread.SetDaemon(true); _thread.Start(); } } }
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, // (int)addr.Address, false, 0x20)); response = new NodeStatusResponse(new NbtAddress(NbtAddress.UnknownName, BitConverter.ToInt32(addr.GetAddressBytes(), 0), 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); }
internal virtual NbtAddress[] GetHosts() { //Log.Out("NbtServiceClient.GetHosts"); try { _waitResponse = false; byte[] bAddrBytes = laddr.GetAddressBytes(); for (int i = 1; i <= 254; i++) { //Log.Out($"NbtServiceClient.GetHosts - {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, BitConverter.ToInt32(addr.GetAddressBytes(), 0), false, 0x20) ); request = new NodeStatusRequest(new Name(NbtAddress.AnyHostsName, unchecked (0x20), null)) { Addr = addr }; Send(request, response, 0); } } catch (IOException ioe) { //Log.Out(ioe); if (_log.Level > 1) { Runtime.PrintStackTrace(ioe, _log); } throw new UnknownHostException(ioe); } _autoResetWaitReceive = new AutoResetEvent(false); if (_thread != null) { _thread.Cancel(true); _thread.Dispose(); } _thread = new Thread(this); _thread.SetDaemon(true); _thread.Start(true); _autoResetWaitReceive.WaitOne(); var result = new List <NbtAddress>(); foreach (var key in _responseTable.Keys) { var resp = (NodeStatusResponse)_responseTable[key]; if (!resp.Received || resp.ResultCode != 0) { continue; } result.AddRange(resp.AddressArray .Where(entry => entry.HostName.HexCode == 0x20)); } _responseTable.Clear(); _waitResponse = true; return(result.Count > 0 ? result.ToArray() : null); }
public virtual void Run() { int nameTrnId; NameServicePacket response; try { while (Thread.CurrentThread().Equals(_thread)) { if (_thread.IsCanceled) { break; } var localPort = (SmbConstants.Lport == 0) ? _lport : SmbConstants.Lport; var sockEvArg = new SocketAsyncEventArgs(); sockEvArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, localPort); sockEvArg.SetBuffer(_rcvBuf, 0, RcvBufSize); sockEvArg.Completed += this.OnReceiveCompleted; _socketSender.SoTimeOut = _closeTimeout; this._recievedLength = -1; //Log.Out($"NameServiceClient.Run - Wait Recieve: {IPAddress.Any}: {localPort}"); _socketSender.ReceiveFromAsync(sockEvArg); while (this._recievedLength == -1) { if (_thread.IsCanceled) { break; } Task.Delay(300).GetAwaiter().GetResult(); } sockEvArg?.Dispose(); if (_thread.IsCanceled) { break; } if (_log.Level > 3) { _log.WriteLine("NetBIOS: new data read from socket"); } nameTrnId = NameServicePacket.ReadNameTrnId(_rcvBuf, 0); response = (NameServicePacket)_responseTable.Get(nameTrnId); if (response == null || response.Received) { continue; } lock (response) { if (_thread.IsCanceled) { break; } response.ReadWireFormat(_rcvBuf, 0); if (_log.Level > 3) { _log.WriteLine(response); Hexdump.ToHexdump(_log, _rcvBuf, 0, this._recievedLength); } if (response.IsResponse) { response.Received = true; Runtime.Notify(response); } } } } catch (TimeoutException) { } catch (Exception ex) { if (_log.Level > 2) { Runtime.PrintStackTrace(ex, _log); } } finally { TryClose(); } }