Exemple #1
0
 public void AllocBuffer(AsyncEnumerator ae, ClientBufferParam buffer)
 {
     if (bufferPool.Count < 2)
     {
         for (int i = 0; i < 1024; ++i)
         {
             bufferPool.Enqueue(settings.initialbuffersize, new byte[settings.initialbuffersize]);
         }
     }
     buffer.sendbuffer = bufferPool.Dequeue();
     buffer.recvbuffer = bufferPool.Dequeue();
     Console.WriteLine("ALLOCED {0} {1}", buffer.recvbuffer.Length, buffer.sendbuffer.Length);
 }
Exemple #2
0
 public void FreeBuffer(AsyncEnumerator ae, ClientBufferParam buffer)
 {
     bufferPool.Enqueue(buffer.sendbuffer.Length, buffer.sendbuffer);
     bufferPool.Enqueue(buffer.recvbuffer.Length, buffer.recvbuffer);
     Console.WriteLine("FREED {0} {1}", buffer.recvbuffer.Length, buffer.sendbuffer.Length);
 }
Exemple #3
0
        static IEnumerator<Int32> ServerConnectRemote(AsyncEnumerator ae, ServerState server, IPEndPoint ipe, TcpClient local)
        {
            // establish a client proxy -> real server connection

            var remote = new TcpClient(ipe.AddressFamily);
            var settings = server.settings;
            remote.NoDelay = true;
            remote.LingerState.Enabled = false;

            remote.BeginConnect(IPAddress.Parse(settings.addressforward), settings.portforward, ae.End(), ae);
            yield return 1;

            try
            {
                remote.EndConnect(ae.DequeueAsyncResult());
            }
            catch (SocketException)
            {
                Console.WriteLine("A client failed to connect, has the real server started?");
                local.Close();
                remote.Close();
                remote = null;
            }

            if(remote != null)
            {
                var bufParam = new ClientBufferParam();

                {
                    server.bufferPoolMutex.BeginRegion(SyncGateMode.Exclusive, ae.End());
                    yield return 1;
                    var res = ae.DequeueAsyncResult();
                    server.AllocBuffer(ae, bufParam);
                    server.bufferPoolMutex.EndRegion(res);
                }

                {
                    var newClientState = new ClientState(local, remote);
                    var remoteAe = new AsyncEnumerator();
                    var localAe = new AsyncEnumerator();
                    var bw1 = new BufferWrapper(bufParam.sendbuffer);
                    var bw2 = new BufferWrapper(bufParam.recvbuffer);
                    localAe.BeginExecute(HandleClient(localAe, server, newClientState, local, remote, bw1, server.filterSend), ae.End(), localAe);
                    remoteAe.BeginExecute(HandleClient(remoteAe, server, newClientState, remote, local, bw2, server.filterRecv), ae.End(), remoteAe);

                    Console.WriteLine("Client Connected {0}", local.Client.RemoteEndPoint);

                    yield return 2;
                    for (int x = 0; x < 2; x++)
                    {
                        IAsyncResult ar = ae.DequeueAsyncResult();
                        ((AsyncEnumerator)ar.AsyncState).EndExecute(ar);
                    }
                    bufParam.sendbuffer = bw1.buffer;
                    bufParam.recvbuffer = bw2.buffer;
                }

                {
                    server.bufferPoolMutex.BeginRegion(SyncGateMode.Exclusive, ae.End());
                    yield return 1;
                    var res = ae.DequeueAsyncResult();
                    server.FreeBuffer(ae, bufParam);
                    server.bufferPoolMutex.EndRegion(res);
                }
            }
        }