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); } }
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; }
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); } }
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(); } }
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); } }
/// <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(); }
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); }
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; }
public void ShouldReturnNonNullSocketArgs() { SocketAsyncEventArgs socketArgs = SocketArgsPool.GetSocketArgs(); Assert.IsNotNull(socketArgs); }
public void ShouldNotFailWhenTryingToReleaseNull() { SocketArgsPool.ReleaseSocketArgs(null); }