Esempio n. 1
0
        public void SendBytes(byte[] bytes, string recipientID, string senderID)
        {
            if (socketOut.Connected)
            {
                LastMessage = DateTime.Now;
                if (Encryptor != null)
                {
                    bytes = Encryptor.EncryptBytes(bytes);
                }
                var messageHeader = new byte[]
                {
                    (byte)(bytes.Length % 10000000000 / 100000000),
                    (byte)(bytes.Length % 100000000 / 1000000),
                    (byte)(bytes.Length % 1000000 / 10000),
                    (byte)(bytes.Length % 10000 / 100),
                    (byte)(bytes.Length % 100),
                };

                bytes = messageHeader.Concat(bytes).ToArray();
                var socketArgs = SocketArgsPool.GetSendArg();
                socketArgs.RecipientID = recipientID;
                socketArgs.SetBuffer(bytes, 0, bytes.Length);
                socketOut.SendAsync(socketArgs);
            }
        }
Esempio n. 2
0
 static SocketServer()
 {
     var max = CurrencyStoreSection.Instance.Server.Buffer.MaxLength;
     var size = CurrencyStoreSection.Instance.Server.Buffer.Size;
     socketArgsPool = new SocketArgsPool(max);
     bufferManager = new BufferPool(max * size, size);
     allowAllowAnonymous = CurrencyStoreSection.Instance.Authorization.AllowAnonymous;
 }
Esempio n. 3
0
        static SocketServer()
        {
            var max  = CurrencyStoreSection.Instance.Server.Buffer.MaxLength;
            var size = CurrencyStoreSection.Instance.Server.Buffer.Size;

            socketArgsPool      = new SocketArgsPool(max);
            bufferManager       = new BufferPool(max * size, size);
            allowAllowAnonymous = CurrencyStoreSection.Instance.Authorization.AllowAnonymous;
        }
Esempio n. 4
0
        private static void WaitForClientMessage(ClientConnection clientConnection)
        {
            var socketArgs = SocketArgsPool.GetReceiveArg();

            socketArgs.Completed += ReceiveFromClientCompleted;
            socketArgs.UserToken  = clientConnection;
            var willFireCallback = clientConnection.Socket.ReceiveAsync(socketArgs);

            if (!willFireCallback)
            {
                ReceiveFromClientCompleted(clientConnection.Socket, socketArgs);
            }
        }
Esempio n. 5
0
 private void WaitForServerMessage()
 {
     if (IsConnected)
     {
         var socketArgs = SocketArgsPool.GetReceiveArg();
         socketArgs.Completed += ReceiveFromServerCompleted;
         var willFireCallback = TcpClient.Client.ReceiveAsync(socketArgs);
         if (!willFireCallback)
         {
             ReceiveFromServerCompleted(TcpClient.Client, socketArgs);
         }
         Pages.Hub.Current.RefreshUICall();
     }
 }
Esempio n. 6
0
        public void SendBytesUnencrypted(byte[] bytes)
        {
            if (socketOut.Connected)
            {
                var messageHeader = new byte[]
                {
                    (byte)(bytes.Length % 10000000000 / 100000000),
                    (byte)(bytes.Length % 100000000 / 1000000),
                    (byte)(bytes.Length % 1000000 / 10000),
                    (byte)(bytes.Length % 10000 / 100),
                    (byte)(bytes.Length % 100),
                };

                bytes = messageHeader.Concat(bytes).ToArray();
                var socketArgs = SocketArgsPool.GetSendArg();
                socketArgs.SetBuffer(bytes, 0, bytes.Length);
                socketOut.SendAsync(socketArgs);
            }
        }
Esempio n. 7
0
        /// <summary>
        ///     关闭服务器
        /// </summary>
        /// <exception cref="关闭服务器的Socket异常"></exception>
        public void CloseServer()
        {
            IsServerStarted = false;
            //获取连接的客户端列表
            var toClose = new ClientInfo[clientList.Count];
            var counter = 0;

            clientLocker.EnterReadLock();
            try
            {
                foreach (var kvp in clientList)
                {
                    toClose[counter] = kvp.Value;
                    counter++;
                }
            }
            finally
            {
                clientLocker.ExitReadLock();
            }
            //断开连接
            for (var i = 0; i < toClose.Length; i++)
            {
                DropClient(toClose[i]);
            }
            try
            {
                serverSocket.Close();
                udpSocket.Close();
            }
            catch (Exception ex)
            {
                ErrorLogger.LogException(ex);
                throw new Exception("关闭服务器时出现异常");
            }
            //释放数据池资源
            //Very important,must set null!!!
            bufferManager = null;
            argsPool      = null;
            mutex.ReleaseMutex();
            frame.SetMessage("服务器已经关闭");
            frame.ToggleBuildButton();
        }
Esempio n. 8
0
        public void ShouldReleaseSocketArgsAndReturnItWhenGettingMoreSocketArgs()
        {
            SocketAsyncEventArgs socketArgs = SocketArgsPool.GetSocketArgs();

            SocketArgsPool.ReleaseSocketArgs(socketArgs);

            SocketAsyncEventArgs result = SocketArgsPool.GetSocketArgs();

            Assert.AreSame(socketArgs, result);
            Assert.AreEqual(null, result.AcceptSocket);
            Assert.AreEqual(null, result.BufferList);
            Assert.AreEqual(false, result.DisconnectReuseSocket);
            Assert.AreEqual(null, result.RemoteEndPoint);
            Assert.AreEqual(null, result.SendPacketsElements);;
            Assert.AreEqual(TransmitFileOptions.UseDefaultWorkerThread, result.SendPacketsFlags);
            Assert.AreEqual(0, result.SendPacketsSendSize);
            Assert.AreEqual(SocketError.Success, result.SocketError);
            Assert.AreEqual(SocketFlags.None, result.SocketFlags);
            Assert.AreEqual(null, result.UserToken);
        }
Esempio n. 9
0
        private void initServer()
        {
            var accept = maxConnection + 1;

            //建立缓存池,包括读写,缓存池的大小为最大连接数×数据包大小×2(2表示读写两个)
            bufferManager = new BufferPool(accept * bufferSize * opsToPreAlloc, bufferSize);
            //同样建立读写参数池
            argsPool = new SocketArgsPool(accept * opsToPreAlloc);
            //根据最大连接数建立Semaphore
            semaphoreAcceptedClients = new Semaphore(accept, accept);
            //预分配数据发送接收参数
            SocketAsyncEventArgs rsArgs;

            for (var i = 0; i < accept * opsToPreAlloc; i++)
            {
                rsArgs            = new SocketAsyncEventArgs();
                rsArgs.Completed += IOCompleted;
                bufferManager.SetBuffer(rsArgs);
                argsPool.Push(rsArgs);
            }
            //接受连接参数
            AcceptArg            = new SocketAsyncEventArgs();
            AcceptArg.Completed += SocketAccepted;
        }
Esempio n. 10
0
        public void ShouldReturnNonNullSocketArgs()
        {
            SocketAsyncEventArgs socketArgs = SocketArgsPool.GetSocketArgs();

            Assert.IsNotNull(socketArgs);
        }
Esempio n. 11
0
 public void ShouldNotFailWhenTryingToReleaseNull()
 {
     SocketArgsPool.ReleaseSocketArgs(null);
 }