/** * 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); } }
public CreationState(EdgeCreationCallback ecb, Queue ipq, int port, TcpEdgeListener tel) { ECB = ecb; IPAddressQueue = ipq; Port = port; TEL = tel; Result = new WriteOnce <object>(); }
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; }
public ShutdownAction(TcpEdgeListener tel) { TEL = tel; }
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); } } } }
public SelectAction(TcpEdgeListener tel) { TEL = tel; }
public CloseDeniedAction(TcpEdgeListener el, TAAuthorizer taa) { TAA = taa; EL = el; }
public CreationState(EdgeCreationCallback ecb, Queue ipq, int port, TcpEdgeListener tel) { ECB = ecb; IPAddressQueue = ipq; Port = port; TEL = tel; Result = new WriteOnce<object>(); }