private void ConnectImpl(string host, int port, int timeout, Action <NetHandler, Exception> callback) { if (!running) { throw new ObjectDisposedException(ToString()); } Stopwatch clock = new Stopwatch(); clock.Start(); Dns.BeginGetHostAddresses(host, ar => { clock.Stop(); timeout -= (int)clock.ElapsedMilliseconds; try { IPAddress[] iplist = Dns.EndGetHostAddresses(ar); if (timeout > 0) { AddressFamily family = AddressFamily.InterNetwork; for (int i = 0; i < iplist.Length; ++i) { if (iplist[i].AddressFamily == AddressFamily.InterNetworkV6) { family = AddressFamily.InterNetworkV6; break; } } NetHandlerImpl socket = new NetHandlerImpl(family, this); Timer timer = new Timer(state => { socket.Socket.Close(); }, null, Timeout.Infinite, Timeout.Infinite); socket.Socket.BeginConnect(iplist, port, result => { try { timer.Dispose(); } catch { } Exception exception = null; try { socket.Socket.EndConnect(result); socket.Socket.Blocking = false; socket.OnConnected(); } catch (ObjectDisposedException) { exception = new SocketException((int)SocketError.TimedOut); } catch (Exception e) { exception = e; socket.Socket.Close(); } callback(exception == null ? socket : null, exception); }, null); timer.Change(timeout, Timeout.Infinite); } else { callback(null, new SocketException((int)SocketError.TimedOut)); } } catch (Exception e) { callback(null, e); } }, null); }
public void Listen(int port, Action <NetHandler> callback) { if (!running) { throw new ObjectDisposedException(ToString()); } new Thread(delegate() { Thread.CurrentThread.Name = "Network Server"; TcpListener server = new TcpListener(IPAddress.Any, port); server.Start(); Control ctrl; lock (listens) { if (listens.TryGetValue(port, out ctrl)) { ctrl.running = true; } else { ctrl = new Control { running = true }; listens[port] = ctrl; } } ctrl.action = callback; while (running) { if (!server.Server.Poll(1000, SelectMode.SelectRead)) { if (!ctrl.running) { break; } continue; } if (!server.Pending()) { break; } NetHandlerImpl socket = new NetHandlerImpl(server.AcceptSocket(), this); socket.Socket.Blocking = false; socket.OnConnected(); Loop.Run(() => { ctrl.action(socket); }); } lock (listens) { Control ctrlnow; if (listens.TryGetValue(port, out ctrlnow) && ctrlnow == ctrl) { listens.Remove(port); } } server.Stop(); }).Start(); new Thread(delegate() { Thread.CurrentThread.Name = "Network Server"; TcpListener server = new TcpListener(IPAddress.IPv6Any, port); server.Start(); Control ctrl; lock (listensv6) { if (listensv6.TryGetValue(port, out ctrl)) { ctrl.running = true; } else { ctrl = new Control { running = true }; listensv6[port] = ctrl; } } ctrl.action = callback; while (running) { if (!server.Server.Poll(1000, SelectMode.SelectRead)) { if (!ctrl.running) { break; } continue; } if (!server.Pending()) { break; } NetHandlerImpl socket = new NetHandlerImpl(server.AcceptSocket(), this); socket.Socket.Blocking = false; socket.OnConnected(); Loop.Run(() => { ctrl.action(socket); }); } lock (listensv6) { Control ctrlnow; if (listensv6.TryGetValue(port, out ctrlnow) && ctrlnow == ctrl) { listensv6.Remove(port); } } server.Stop(); }).Start(); }