Exemple #1
0
        private void m_ProcessUDPPacket(byte command, ref MemoryStream packet)
        {
            try
            {
                switch ((Protocol.ClientCommandExtUDP)command)
                {
                case Protocol.ClientCommandExtUDP.ReaskFilePing:
                    if (!m_PortIsAccesible)
                    {
                        CLog.Log(Types.Constants.Log.Info, "UDP_PORT_IS_OPEN");
                    }
                    m_PortIsAccesible = true;
                    MemoryStream responseBuffer;
//						if (packet.Length!=16) break;
//						byte[] FilaHash=new byte[16];
//						packet.Read(FilaHash,0,16);
                    CFileReaskUDP reaskMessage = new CFileReaskUDP(packet);
                    byte[]        FilaHash     = reaskMessage.FileHash;
                    //byte[] chunksAvaibility=reaskMessage.partes;
                    //TODO update chunksAvaibility in shared file

                    CElement requestedElement = CKernel.FilesList[FilaHash];
                    if (requestedElement == null)
                    {
                        responseBuffer = new MemoryStream(2);
                        CFileNotFoundUDP FicheroNoEncontradoUDP = new CFileNotFoundUDP(responseBuffer);
                    }
                    else
                    {
                        m_RemoteIPEndPoint = (IPEndPoint)m_RemoteEndPoint;
                        CClient foundClient   = null;
                        ushort  queuePosition = CKernel.Queue.RefreshClientUDP(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(), 0), (ushort)m_RemoteIPEndPoint.Port, ref foundClient);
                        if (queuePosition <= 0)
                        {
                            responseBuffer = new MemoryStream(2);
                            CQueueFullUDP PaqueteColaLlenaUDP = new CQueueFullUDP(responseBuffer);
                        }
                        else
                        {
                            responseBuffer = new MemoryStream(4);
                            CQueuePositionUDP PaquetePosicionColaUDP = new CQueuePositionUDP(responseBuffer, queuePosition, requestedElement.File.ChunksStatus, foundClient.VersionUDP);
                        }
                    }
                    SendPacketUDP(responseBuffer.GetBuffer(), m_RemoteIPEndPoint);
                    break;

                case Protocol.ClientCommandExtUDP.ReaskAck:
                    m_RemoteIPEndPoint = (IPEndPoint)m_RemoteEndPoint;
                    CClient client = CKernel.ClientsList.GetClient(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(), 0), 0, 0, null);
                    if (client != null)
                    {
                        ushort queuePosition;


                        if ((packet.Length > 2) && (client.VersionUDP > 3))
                        {
                            packet.Seek(0, SeekOrigin.Begin);
                            client.ProcessChunksStatus(packet, true);
                        }
                        BinaryReader reader = new BinaryReader(packet);
                        queuePosition = reader.ReadUInt16();
                        client.ProcessUDPReask(queuePosition);
                        packet.Close();
                        packet = null;
                    }
                    break;

                case Protocol.ClientCommandExtUDP.QueueFull:
                    client = CKernel.ClientsList.GetClient(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(), 0), 0, 0, null);
                    if (client != null)
                    {
                        client.ProcessUDPReask(0);
                    }
                    break;

                case Protocol.ClientCommandExtUDP.FileNotFound:
                    client = CKernel.ClientsList.GetClient(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(), 0), 0, 0, null);
                    if ((client != null) && (client.DownloadElement != null) && (client.DownloadElement.SourcesList != null))
                    {
                        client.DownloadElement.SourcesList.RemoveSource(client);
                    }
                    break;

                default:
                    CLog.Log(Constants.Log.Verbose, "CLI_UNK_UDP_PACKET", command);
                    break;
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
                CLog.Log(Constants.Log.Verbose, "CLI_PAQ_UDP_ERROR", command);
            }
        }
Exemple #2
0
 private void m_ProcessUDPPacket(byte command, ref MemoryStream packet)
 {
     //          try
     //          {
     switch ( (Protocol.ClientCommandExtUDP)command )
     {
     case Protocol.ClientCommandExtUDP.ReaskFilePing:
     if (!m_PortIsAccesible)
         CLog.Log(Types.Constants.Log.Info,"UDP_PORT_IS_OPEN");
     m_PortIsAccesible=true;
     MemoryStream responseBuffer;
     //                      if (packet.Length!=16) break;
     //                      byte[] FilaHash=new byte[16];
     //                      packet.Read(FilaHash,0,16);
     CFileReaskUDP reaskMessage=new CFileReaskUDP(packet);
     byte[] FilaHash=reaskMessage.FileHash;
     //byte[] chunksAvaibility=reaskMessage.partes;
     //TODO update chunksAvaibility in shared file
     CElement requestedElement=CKernel.FilesList[FilaHash];
     if (requestedElement==null)
     {
         responseBuffer=new MemoryStream(2);
         CFileNotFoundUDP FicheroNoEncontradoUDP=new CFileNotFoundUDP(responseBuffer);
     }
     else
     {
         m_RemoteIPEndPoint=(IPEndPoint)m_RemoteEndPoint;
         CClient foundClient=null;
         ushort queuePosition=CKernel.Queue.RefreshClientUDP(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(),0),(ushort)m_RemoteIPEndPoint.Port,ref foundClient);
         if (queuePosition<=0)
         {
             responseBuffer=new MemoryStream(2);
             CQueueFullUDP PaqueteColaLlenaUDP=new CQueueFullUDP(responseBuffer);
         }
         else
         {
             responseBuffer=new MemoryStream(4);
             CQueuePositionUDP PaquetePosicionColaUDP=new CQueuePositionUDP(responseBuffer,queuePosition,requestedElement.File.ChunksStatus,foundClient.VersionUDP);
         }
     }
     SendPacketUDP(responseBuffer.GetBuffer(),m_RemoteIPEndPoint);
     break;
     case Protocol.ClientCommandExtUDP.ReaskAck:
     m_RemoteIPEndPoint=(IPEndPoint)m_RemoteEndPoint;
     CClient client=CKernel.ClientsList.GetClient(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(),0),0,0,null);
     if (client!=null)
     {
         ushort queuePosition;
         if ((packet.Length>2)&&(client.VersionUDP>3))
         {
             packet.Seek(0,SeekOrigin.Begin);
             client.ProcessChunksStatus(packet,true);
         }
         BinaryReader reader=new BinaryReader(packet);
         queuePosition=reader.ReadUInt16();
         client.ProcessUDPReask(queuePosition);
         packet.Close();
         packet=null;
     }
     break;
     case Protocol.ClientCommandExtUDP.QueueFull:
     client=CKernel.ClientsList.GetClient(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(),0),0,0,null);
     if (client!=null)
     {
         client.ProcessUDPReask(0);
     }
     break;
     case Protocol.ClientCommandExtUDP.FileNotFound:
     client=CKernel.ClientsList.GetClient(BitConverter.ToUInt32(m_RemoteIPEndPoint.Address.GetAddressBytes(),0),0,0,null);
     if ((client!=null)&&(client.DownloadElement!=null)&&(client.DownloadElement.SourcesList!=null))
         client.DownloadElement.SourcesList.RemoveSource(client);
     break;
     default:
     CLog.Log(Constants.Log.Verbose,"CLI_UNK_UDP_PACKET",command);
     break;
     }
     //          }
     //          catch(Exception e)
     //          {
     //              Debug.WriteLine(e.ToString());
     //              CLog.Log(Constants.Log.Verbose,"CLI_PAQ_UDP_ERROR",command);
     //          }
 }