Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 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();
 }