public void AddSocket(ISocket socket)
    {
        SocketElement instance = Instantiate(socketPrefab);

        instance.transform.SetParent(transform);

        instance.Initialize(socket);
    }
Ejemplo n.º 2
0
        private void CloseClientSocket(SocketAsyncEventArgs e)
        {
            SocketElement se = e.UserToken as SocketElement;

            try
            {
                se.Socket.Shutdown(SocketShutdown.Send);
            }
            catch (Exception) { }
            Interlocked.Decrement(ref connCount);
            SemaphoreAcceptedClients.Release();
            Clients.Push(e);
        }
Ejemplo n.º 3
0
            public SocketAsyncEventArgs Pop(SocketElement UserToken)
            {
                SocketAsyncEventArgs arg;

                lock (freePool)
                {
                    arg = freePool.Pop();
                }
                arg.UserToken = UserToken;
                lock (busyPool)
                {
                    busyPool.Add(UserToken.UID, arg);
                }
                return(arg);
            }
Ejemplo n.º 4
0
            public void Push(SocketAsyncEventArgs arg)
            {
                SocketElement se = (SocketElement)arg.UserToken;

                lock (busyPool)
                {
                    if (busyPool.ContainsKey(se.UID))
                    {
                        busyPool.Remove(se.UID);
                    }
                }
                lock (freePool)
                {
                    freePool.Push(arg);
                }
            }
Ejemplo n.º 5
0
        private void ProcessAccept(SocketAsyncEventArgs e)
        {
            if (e.LastOperation != SocketAsyncOperation.Accept)
            {
                return;
            }
            if (e.BytesTransferred <= 0)
            {
                return;
            }
            //不允许同Ip多个连接
            if (Clients.CheckIpOnLine((e.AcceptSocket.RemoteEndPoint as IPEndPoint).Address.ToString()))
            {
                return;
            }
            SocketElement se = new SocketElement("", e.AcceptSocket);

            SetUserToken?.Invoke(null, se);//
            if (Clients.ContainsUID(se.UID))
            {
                SocketException?.Invoke(new Exception("用户id已存在!"));
                return;
            }
            SocketAsyncEventArgs arg = Clients.Pop(se);

            ((SocketElement)arg.UserToken).Socket = e.AcceptSocket;
            Interlocked.Increment(ref connCount);

            bool willRaiseEvent = e.AcceptSocket.ReceiveAsync(arg);

            if (!willRaiseEvent)
            {
                ProcessReceive(arg);
            }

            StartAccept(e);
        }
Ejemplo n.º 6
0
 public UserTokenEventArgs(SocketElement u)
 {
     User = u;
 }