상속: EdgeListener, IEdgeSendHandler
예제 #1
0
 /**
  * Called when the socket is writable
  */
 public void HandleWritability(Socket s)
 {
     try {
         if (s.Connected)
         {
             TcpEdgeListener.SetSocketOpts(s);
             TcpEdge e = new TcpEdge(TEL, false, s);
             Result.Value = e;
             //Handle closes in the select thread:
             CloseAction ca = new CloseAction(e, TEL.ActionQueue);
             e.CloseEvent += ca.CloseHandler;
             //Set the edge
             TEL.ActionQueue.Enqueue(this);
         }
         else
         {
             //This did not work out, close the socket and release the resources:
             HandleError(s);
         }
     }
     catch (Exception) {
         //This did not work out, close the socket and release the resources:
         //Console.WriteLine("Exception: {0}", x);
         HandleError(s);
     }
 }
예제 #2
0
 public CreationState(EdgeCreationCallback ecb,
                      Queue ipq, int port,
                      TcpEdgeListener tel)
 {
     ECB            = ecb;
     IPAddressQueue = ipq;
     Port           = port;
     TEL            = tel;
     Result         = new WriteOnce <object>();
 }
예제 #3
0
 public SocketState(TcpEdgeListener tel)
 {
     _sock_to_rs       = new Hashtable();
     _sock_to_constate = new ListDictionary();
     _con_socks        = new ArrayList();
     ListenSock        = tel._listen_sock;
     _socks_to_send    = new ArrayList();
     AllSockets        = new ArrayList();
     ReadSocks         = new ArrayList();
     ErrorSocks        = new ArrayList();
     WriteSocks        = new ArrayList();
     Run = true;
     /* Use a shared BufferAllocator for all Edges */
     BA = new BufferAllocator(2 + Int16.MaxValue);
     ListenSock.Listen(10);
     TEL = tel;
 }
예제 #4
0
 public ShutdownAction(TcpEdgeListener tel)
 {
     TEL = tel;
 }
예제 #5
0
            protected void HandleReads(SocketState ss)
            {
                ArrayList readsocks   = ss.ReadSocks;
                Socket    listen_sock = ss.ListenSock;

                for (int i = 0; i < readsocks.Count; i++)
                {
                    Socket s = (Socket)readsocks[i];
                    //See if this is a new socket
                    if (s == listen_sock)
                    {
                        TcpEdge e     = null;
                        Socket  new_s = null;
                        try {
                            new_s = listen_sock.Accept();
                            IPEndPoint rep = (IPEndPoint)new_s.RemoteEndPoint;
                            new_s.LingerState = new LingerOption(true, 0);
                            TransportAddress rta =
                                TransportAddressFactory.CreateInstance(TransportAddress.TAType.Tcp, rep);
                            if (ss.TAA.Authorize(rta) == TAAuthorizer.Decision.Deny)
                            {
                                //No thank you Dr. Evil
                                Console.Error.WriteLine("Denying: {0}", rta);
                                new_s.Close();
                            }
                            else
                            {
                                //This edge looks clean
                                TcpEdgeListener.SetSocketOpts(s);
                                e = new TcpEdge(TEL, true, new_s);
                                ss.AddEdge(e);
                                //Handle closes in the select thread:
                                CloseAction ca = new CloseAction(e, TEL.ActionQueue);
                                e.CloseEvent += ca.CloseHandler;
                                TEL.SendEdgeEvent(e);
                            }
                        }
                        catch (Exception) {
                            //Looks like this Accept has failed.  Do nothing
                            //Console.Error.WriteLine("New incoming edge ({0}) failed: {1}", new_s, sx);
                            //Make sure the edge is closed
                            if (e != null)
                            {
                                TEL.RequestClose(e);
                                //Go ahead and forget about this socket.
                                CloseAction ca = new CloseAction(e, null);
                                ca.Start(ss);
                            }
                            else if (new_s != null)
                            {
                                //This should not be able to throw an exception:
                                new_s.Close();
                            }
                        }
                    }
                    else
                    {
                        ReceiveState rs = ss.GetReceiveState(s);
                        if (rs != null && !rs.Receive())
                        {
                            TEL.RequestClose(rs.Edge);
                            //Go ahead and forget about this socket.
                            CloseAction ca = new CloseAction(rs.Edge, null);
                            ca.Start(ss);
                        }
                    }
                }
            }
예제 #6
0
 public SelectAction(TcpEdgeListener tel)
 {
     TEL = tel;
 }
예제 #7
0
 public CloseDeniedAction(TcpEdgeListener el, TAAuthorizer taa)
 {
     TAA = taa;
     EL  = el;
 }
예제 #8
0
 public SocketState(TcpEdgeListener tel) {
   _sock_to_rs = new Hashtable();
   _sock_to_constate = new ListDictionary();
   _con_socks = new ArrayList();
   ListenSock = tel._listen_sock;
   _socks_to_send = new ArrayList();
   AllSockets = new ArrayList();
   ReadSocks = new ArrayList();
   ErrorSocks = new ArrayList();
   WriteSocks = new ArrayList();
   Run = true;
   /* Use a shared BufferAllocator for all Edges */
   BA = new BufferAllocator(2 + Int16.MaxValue);
   ListenSock.Listen(10);
   TEL = tel;
 }
예제 #9
0
 public ShutdownAction(TcpEdgeListener tel) {
   TEL = tel;
 }
예제 #10
0
 public SelectAction(TcpEdgeListener tel) {
   TEL = tel;
 }
예제 #11
0
 public CreationState(EdgeCreationCallback ecb,
                      Queue ipq, int port,
                      TcpEdgeListener tel)
 {
   ECB = ecb;
   IPAddressQueue = ipq;
   Port = port;
   TEL = tel;
   Result = new WriteOnce<object>();
 }
예제 #12
0
 public CloseDeniedAction(TcpEdgeListener el, TAAuthorizer taa) {
   TAA = taa;
   EL = el;
 }