public override TrinityErrorCode SaveCell(long cell_id, byte *cellBytes, int cellSize, ushort cellType)
        {
            TrinityMessage msg = new TrinityMessage(TrinityMessageType.PRESERVED_SYNC_WITH_RSP, (ushort)RequestType.SaveCell, cellSize + 14 /*cell_type(2)+ cell_id(8) +cell_size(4)*/);
            byte *         p   = msg.Buffer + TrinityMessage.Offset;

            *(ushort *)p = cellType;
            p           += 2;

            *(long *)p = cell_id;
            p         += 8;

            *(int *)p = cellSize;
            p        += 4;

            Memory.Copy(cellBytes, p, cellSize);

            TrinityResponse response;

            Network.Client.SynClient sc = GetClient();
            bool sendSuccess            = (TrinityErrorCode.E_SUCCESS == sc.SendMessage(msg.Buffer, msg.Size, out response));

            PutBackClient(sc);
            msg.Dispose();

            var eResult = response.ErrorCode;

            response.Dispose();
            return(sendSuccess ? eResult : TrinityErrorCode.E_NETWORK_SEND_FAILURE);
        }
예제 #2
0
        private int Heartbeat()
        {
            Network.Client.SynClient sc      = GetClient();
            TrinityErrorCode         eResult = sc.Heartbeat();

            PutBackClient(sc);

            if (TrinityErrorCode.E_SUCCESS == eResult)
            {
                if (!m_connected)
                {
                    m_connected = true;
                    m_memorycloud.ReportServerConnectedEvent(this);
                }
            }
            else
            {
                if (m_connected)
                {
                    m_connected = false;
                    m_memorycloud.ReportServerDisconnectedEvent(this);
                    InvalidateSynClients();
                }
            }

            return(TrinityConfig.HeartbeatInterval);
        }
        public override TrinityErrorCode LoadCell(long cellId, out byte[] cellBuff, out ushort cellType)
        {
            TrinityMessage msg = new TrinityMessage(TrinityMessageType.PRESERVED_SYNC_WITH_RSP, (ushort)RequestType.LoadCellWithType, sizeof(long));

            *(long *)(msg.Buffer + TrinityMessage.Offset) = cellId;

            TrinityResponse response;

            Network.Client.SynClient sc = GetClient();
            bool sendSuccess            = (TrinityErrorCode.E_SUCCESS == sc.SendMessage(msg.Buffer, msg.Size, out response));

            PutBackClient(sc);
            msg.Dispose();

            int   payload_len = response.Size - response.Offset;
            byte *payload_ptr = response.Buffer + response.Offset;
            int   cell_len    = payload_len - sizeof(ushort);

            cellBuff = new byte[cell_len];
            var eResult = response.ErrorCode;

            Memory.Copy(payload_ptr, 0, cellBuff, 0, cell_len);
            cellType = *(ushort *)(payload_ptr + cell_len);
            response.Dispose();
            return(sendSuccess ? eResult : TrinityErrorCode.E_NETWORK_SEND_FAILURE);
        }
        public override bool Contains(long cellId)
        {
            TrinityMessage   request;
            TrinityResponse  response;
            TrinityErrorCode eResult;
            bool             contains = false;

            request = new TrinityMessage(TrinityMessageType.PRESERVED_SYNC_WITH_RSP, (ushort)RequestType.Contains, sizeof(long));
            *(long *)(request.Buffer + TrinityMessage.Offset) = cellId;
            Network.Client.SynClient sc = GetClient();
            eResult = sc.SendMessage(request.Buffer, request.Size, out response);
            PutBackClient(sc);

            if (eResult == TrinityErrorCode.E_SUCCESS)
            {
                //returns E_CELL_FOUND or E_CELL_NOTFOUND
                contains = (response.ErrorCode == TrinityErrorCode.E_CELL_FOUND);
            }

            request.Dispose();
            response.Dispose();

            _error_check(eResult);
            return(contains);
        }
예제 #5
0
        public TrinityErrorCode UpdateCell(long cellId, byte *cellPtr, int length)
        {
            TrinityMessage msg = new TrinityMessage(TrinityMessageType.PRESERVED_SYNC_WITH_RSP, (ushort)RequestType.UpdateCell, length + 12 /*cell_id(8) +cell_size(4)*/);
            byte *         p   = msg.Buffer + TrinityMessage.Offset;

            *(long *)p = cellId;
            p         += 8;

            *(int *)p = length;
            p        += 4;

            Memory.Copy(cellPtr, p, length);

            TrinityResponse response;

            Network.Client.SynClient sc = GetClient();
            bool sendSuccess            = (TrinityErrorCode.E_SUCCESS == sc.SendMessage(msg.Buffer, msg.Size, out response));

            PutBackClient(sc);
            msg.Dispose();

            var eResult = response.ErrorCode;

            response.Dispose();
            return(sendSuccess ? eResult : TrinityErrorCode.E_NETWORK_SEND_FAILURE);
        }
        public override TrinityErrorCode RemoveCell(long cell_id)
        {
            TrinityMessage msg = new TrinityMessage(TrinityMessageType.PRESERVED_SYNC_WITH_RSP, (ushort)RequestType.RemoveCell, sizeof(long));

            *(long *)(msg.Buffer + TrinityMessage.Offset) = cell_id;

            TrinityResponse response;

            Network.Client.SynClient sc = GetClient();
            bool sendSuccess            = (TrinityErrorCode.E_SUCCESS == sc.SendMessage(msg.Buffer, msg.Size, out response));

            PutBackClient(sc);
            msg.Dispose();

            var eResult = response.ErrorCode;

            response.Dispose();

            return(sendSuccess ? eResult : TrinityErrorCode.E_NETWORK_SEND_FAILURE);
        }
예제 #7
0
 private void ConnectIPEndPoint(IPEndPoint ip_endpoint)
 {
     while (true)
     {
         try
         {
             var client = new Network.Client.SynClient(ip_endpoint);
             if (client.sock_connected)
             {
                 ConnPool.Add(client);
                 ++m_client_count;
                 connected = true;
                 break;
             }
         }
         catch (Exception)
         {
             Log.WriteLine(LogLevel.Debug, "Cannot connect to {0}", ip_endpoint);
             Thread.Sleep(100);
         }
     }
 }
예제 #8
0
 private void Connect(ServerInfo server_info)
 {
     while (true)
     {
         try
         {
             var ep     = server_info.EndPoint;
             var client = new Network.Client.SynClient(ep);
             if (client.sock_connected)
             {
                 ConnPool.Add(client);
                 ++m_client_count;
                 m_connected = true;
                 break;
             }
         }
         catch (Exception ex)
         {
             Log.WriteLine(LogLevel.Debug, "RemoteStorage: Cannot connect to {0}:{1}: {2}", server_info.HostName, server_info.Port, ex.Message);
             Thread.Sleep(100);
         }
     }
 }
예제 #9
0
 private void PutBackClient(Network.Client.SynClient sc)
 {
     ConnPool.Add(sc);
 }