예제 #1
0
        public void Broadcast(ClientSocket srcSock)
        {
            Parallel.ForEach <ClientSocket>(portMap[srcSock].Clients, (dstSock, loopState) =>
            {
                if (dstSock.SocketID == srcSock.SocketID)
                {
                    loopState.Break();
                }

                int mProcessId = GetProcessId(dstSock);
                if (mProcessId == -1)
                {
                    loopState.Break();
                }

                System.Net.Sockets.SocketInformation mInfomation = srcSock.cSocket.DuplicateAndClose(mProcessId);
                ExchangeObject mObject = new ExchangeObject
                {
                    PackType     = (int)Common.ECommand.SocketInfo,
                    SerialNumber = 0,
                    mData        = Common.SerializeSocketInfo(mInfomation)
                };
                mObject.PackLength = 12 + mObject.mData.Length;
                byte[] mBytes      = mObject.ToBuffer();
                server.SendData(dstSock.SocketID, mBytes);
            });
            Logs.Create("根据映射配置,将" + srcSock.sRemoteIPAndPort.Replace(":", "_") + "的数据群发Broadcast到:" + portMap[srcSock].Clients.Count + "个客户端");
        }
예제 #2
0
 public static System.Net.Sockets.SocketInformation DeserializeSocketInfo(byte[] mBytes)
 {
     using (MemoryStream ms = new MemoryStream(mBytes))
     {
         BinaryFormatter mFormatter = new BinaryFormatter();
         System.Net.Sockets.SocketInformation mInfo = (System.Net.Sockets.SocketInformation)mFormatter.Deserialize(ms);
         return(mInfo);
     }
 }
예제 #3
0
        public void TransferConnection(System.Net.Sockets.SocketInformation socketInfo, String cacheId, byte[] transferCommand)
        {
            ManagementCommand command = GetManagementCommand(ManagementUtil.MethodName.TransferConnection);

            command.Parameters.AddParameter(socketInfo);
            command.Parameters.AddParameter(cacheId);
            command.Parameters.AddParameter(transferCommand);
            ExecuteCommandOnCacehServer(command);
        }
예제 #4
0
 public static byte[] SerializeSocketInfo(System.Net.Sockets.SocketInformation mInfo)
 {
     using (MemoryStream ms = new MemoryStream())
     {
         BinaryFormatter mFormatter = new BinaryFormatter();
         mFormatter.Serialize(ms, mInfo);
         ms.Position = 0;
         byte[] mBytes = new byte[ms.Length];
         ms.Read(mBytes, 0, mBytes.Length);
         return(mBytes);
     }
 }
예제 #5
0
        public void ExchangeTransfer(ClientSocket srcSock, ClientSocket dstSock)
        {
            if (dstSock.SocketID == srcSock.SocketID)
            {
                return;
            }

            int mProcessId = GetProcessId(dstSock);

            if (mProcessId == -1)
            {
                return;
            }

            System.Net.Sockets.SocketInformation mInfomation = srcSock.cSocket.DuplicateAndClose(mProcessId);
            ExchangeObject mObject = new ExchangeObject
            {
                PackType     = (int)Common.ECommand.SocketInfo,
                SerialNumber = 0,
                mData        = Common.SerializeSocketInfo(mInfomation)
            };

            mObject.PackLength = 12 + mObject.mData.Length;
            byte[] mBytes = mObject.ToBuffer();
            server.SendData(dstSock.SocketID, mBytes);
            //Thread.Sleep(100);
            //ExchangeObject mObject2 = new ExchangeObject();
            //byte[] mBytes2 = mObject2.ToBuffer<Data>(new Data
            //{
            //    DataGuid = Guid.NewGuid(),
            //    Buffer = null
            //}, Common.ECommand.Data);
            //byte[] mBytes2 = mObject2.ToBuffer<int>(mProcessId, Common.ECommand.Login);
            //server.SendData(dstSock.SocketID, mBytes2);
            Logs.Create("根据映射配置,将" + srcSock.sRemoteIPAndPort.Replace(":", "_") + "的数据转发ExchangeTransfer到:" + dstSock.sRemoteIPAndPort);
        }
예제 #6
0
 public override void TransferConnection(System.Net.Sockets.SocketInformation socketInfo, String cacheId, byte[] transferCommand)
 {
     ConnectionManager.OnClientConnected(socketInfo, transferCommand);
 }
예제 #7
0
 public Socket(System.Net.Sockets.SocketInformation socketInformation)
 {
 }