예제 #1
0
        private static void AcceptCallback(IAsyncResult IAR)
        {
            Socket Server, handler;

            try
            {
                Server  = (Socket)IAR.AsyncState;
                handler = Server.EndAccept(IAR);
            }
            catch (ObjectDisposedException ode)
            {
                ExceptionBuffer.Add(ode);
                return;
            }

            allDone.Set();

            string sKey = TcpAsyncCommon.DefaultUID + ++iAcceptCounter;

            StateObject state = new StateObject();

            state.workSocket = handler;
            state.key        = sKey;

            D2Sockets.Set(sKey, state);
            D2TReceive.Set(sKey, null);
            D2TSend.Set(sKey, null);
            D3BReceive.Set(sKey, new DataBuffer());
            D3BSend.Set(sKey, new DataBuffer());
        }
예제 #2
0
        private static void DisconnectCallback(IAsyncResult IAR)
        {
            StateObject state   = (StateObject)IAR.AsyncState;
            Socket      handler = state.workSocket;
            string      key     = state.key;



            handler.EndDisconnect(IAR);



            handler.Shutdown(SocketShutdown.Both);
            handler.Disconnect(true);
            handler.Close();

            handler.Dispose();



            D2Sockets.Remove(key);
            D2TReceive.Remove(key);
            D2TSend.Remove(key);
            D3BReceive.Remove(key);
            D3BSend.Remove(key);
        }
예제 #3
0
        public void Stop(string key)
        {
            if (key.IsNullOrEmpty())
            {
                return;
            }

            try
            {
                GetHandler(key).Cleanup();
            }
            finally
            {
                if (D2Sockets != null)
                {
                    D2Sockets.Remove(key);
                }
                if (D3BReceive != null)
                {
                    D3BReceive.Remove(key);
                }
                if (D3BSend != null)
                {
                    D3BSend.Remove(key);
                }
            }
        }
예제 #4
0
파일: Start.cs 프로젝트: jeason0813/Asmodat
        private void AcceptCallback(IAsyncResult IAR)
        {
            Socket Server, handler;

            try
            {
                Server  = (Socket)IAR.AsyncState;
                handler = Server.EndAccept(IAR);
            }
            catch (ObjectDisposedException ode)
            {
                Exceptions.Write(ode);
                return;
            }

            allDone.Set();

            string sKey = TcpAsyncCommon.DefaultUID + TickTime.NowTicks;

            StateObject state = new StateObject();

            state.workSocket = handler;
            state.key        = sKey;

            D2Sockets.Set(sKey, state);
            D3BReceive.Set(sKey, new BufferedArray <byte[]>(this.Length));
            D3BSend.Set(sKey, new BufferedArray <byte[]>(this.Length));
        }
예제 #5
0
 public byte[][] ReadAll(string key)
 {
     if (D3BReceive == null || !D3BReceive.Contains(key))
     {
         return(null);
     }
     try
     {
         return(D3BReceive.Get(key).ReadAll());
     }
     catch
     {
         return(null);
     }
 }
예제 #6
0
        public bool SetReceiver(string key, byte[] data)
        {
            if (D3BReceive == null || !D3BReceive.Contains(key) || key.IsNullOrEmpty() || data.IsNullOrEmpty())
            {
                return(false);
            }

            try
            {
                D3BReceive.Get(key).Write(data);
                return(true);
            }
            catch
            {
                return(false);
            }
        }
예제 #7
0
 public byte[] Read(string key)
 {
     if (D3BReceive == null || !D3BReceive.Contains(key))
     {
         return(null);
     }
     try
     {
         byte[] read;
         D3BReceive.Get(key).Read(out read);
         return(read);
     }
     catch
     {
         return(null);
     }
 }
예제 #8
0
파일: main.cs 프로젝트: jeason0813/Asmodat
        public void Stop(string key)
        {
            StateObject state = D2Sockets.Get(key);

            try
            {
                if (state != null && state.workSocket != null)
                {
                    Socket handler = state.workSocket;
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Disconnect(true);
                    handler.Close();
                    handler.Dispose();
                }
            }
            catch
            {
            }
            finally
            {
                if (D2Sockets != null)
                {
                    D2Sockets.Remove(key);
                }
                if (D2TReceive != null)
                {
                    D2TReceive.Remove(key);
                }
                if (D2TSend != null)
                {
                    D2TSend.Remove(key);
                }
                if (D3BReceive != null)
                {
                    D3BReceive.Remove(key);
                }
                if (D3BSend != null)
                {
                    D3BSend.Remove(key);
                }
            }
        }
예제 #9
0
파일: Start.cs 프로젝트: jeason0813/Asmodat
        private void Accept()
        {
            Socket handler = Listener.Accept();
            string key     = TcpAsyncCommon.DefaultUID + TickTime.NowTicks;

            StateObject state = new StateObject();

            state.workSocket                   = handler;
            state.workSocket.NoDelay           = TcpAsyncServer.NoDelay;
            state.workSocket.SendBufferSize    = TcpAsyncServer.PacketSizeTCP;
            state.workSocket.ReceiveBufferSize = TcpAsyncServer.PacketSizeTCP;
            state.workSocket.SendTimeout       = TcpAsyncServer.SendTimeout;
            state.workSocket.ReceiveTimeout    = TcpAsyncServer.ReceiveTimeout;
            state.workSocket.Ttl               = TcpAsyncServer.Ttl;
            state.key  = key;
            state.Time = TickTime.Now;

            D2Sockets.Set(key, state);
            D3BReceive.Set(key, new BufferedArray <byte[]>(this.Length));
            D3BSend.Set(key, new BufferedArray <byte[]>(this.Length));

            //this.Send(key, "#START".GetBytes());
        }
예제 #10
0
        private static void ReadCallback(IAsyncResult IAR)
        {
            StateObject state     = (StateObject)IAR.AsyncState;
            Socket      handler   = state.workSocket;
            int         bytesRead = 0;

            if (!handler.Connected)
            {
                return;
            }
            try
            {
                bytesRead = handler.EndReceive(IAR);
            }
            catch
            {
                return;
            }

            if (bytesRead <= 0)
            {
                return;
            }

            System.String content = System.String.Empty;
            state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
            content = state.sb.ToString();


            if (content.IndexOf(TcpAsyncCommon.EOM) < 0)
            {
                if (content.Length < StateObject.BufferSize / 2)
                {
                    try
                    {
                        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
                    }catch (Exception e)
                    {
                        ExceptionBuffer.Add(e);
                    }
                }
                else
                {
                    state.sb.Clear();
                    //state.buffer = new byte[StateObject.BufferSize];
                    return;
                }
            }

            state.sb.Clear();
            //state.buffer = new byte[StateObject.BufferSize];
            List <string> Packets = content.SplitSafe(TcpAsyncCommon.EOM).ToList();

            if (Packets.Count > 0)
            {
                foreach (string packet in Packets)
                {
                    string subPacket = packet;
                    if (subPacket == null)
                    {
                        subPacket = "";
                    }
                    else
                    {
                        subPacket = subPacket.Replace(@"\\", @"\");
                    }

                    if (!D3BReceive.Contains(state.key))
                    {
                        return;
                    }
                    else
                    {
                        D3BReceive.Get(state.key).Set(subPacket);
                    }
                    //Thread.Sleep(1);
                }
            }
        }