private static void Main()
        {
            byte[] receivedBytes;
            UdpClient client = GetConnectedClientObject();

            while (true) {
                receivedBytes = client.Receive(ref remoteIPEndPoint);

                IPHostEntry host;
                host = Dns.GetHostEntry(remoteIPEndPoint.Address);

                if (host.HostName == Constants.IGNORE_HOSTNAME_STRING) {
                    continue;
                }

                sendAddress = remoteIPEndPoint.Address;
                remoteIPEndPoint = new IPEndPoint(sendAddress, remoteIPEndPoint.Port);
                client.Connect(remoteIPEndPoint);

                if (!Utils.VerifyChecksum(receivedBytes))
                    continue;

                switch (receivedBytes[Constants.FIELD_TYPE]) {
                    case Constants.TYPE_DIRECTORY_REQUEST:
                        bool success = false;
                        while (!success) {
                            AckPacket ack = new AckPacket(-1);
                            Utils.SendTo(client, ack.MyPacketAsBytes);
                            success = PingPong.SendDirectoryTo(client);
                        }
                        break;
                    case Constants.TYPE_FILE_DELIVERY:
                        if (Constants.DEBUG_PING_PONG_ACTIVE) {
                            bool receiveSuccess = false;
                            while (!receiveSuccess) {
                                AckPacket ack = new AckPacket(-1);
                                Utils.SendTo(client, ack.MyPacketAsBytes);
                                receiveSuccess = PingPong.ReceiveFileFrom(receivedBytes, client);
                            }
                        }
                        break;
                    case Constants.TYPE_FILE_REQUEST:
                        byte[] rawFilename = new byte[BitConverter.ToInt32(receivedBytes, Constants.FIELD_FILENAME_LENGTH)];
                        for (int i = 0; i < rawFilename.Length; i++) {
                            rawFilename[i] = receivedBytes[i + Constants.FIELD_FILENAME];
                        }

                        PingPong.SendFileTo(Encoding.Default.GetString(rawFilename), client);

                        break;
                    default:
                        break;
                }
            }
        }
        public static bool StartReceiveDirectory(byte[] metadataAsBytes, UdpClient target)
        {
            if (!Utils.VerifyChecksum(metadataAsBytes)) {
                return false;
            }
            AckPacket ack = new AckPacket(-1);
            Utils.SendTo(target, ack.MyPacketAsBytes);

            bool success = false;
            while (!success) {
                success = CatchMetadataResend(metadataAsBytes, target);
            }
            return true;
        }
 public static void SendAckTo(int id, UdpClient target)
 {
     AckPacket theAckToSend = new AckPacket(id);
     Utils.SendTo(target, theAckToSend.MyPacketAsBytes);
 }
        public static bool CatchMetadataResend(byte[] metadataAsBytes, UdpClient target)
        {
            byte[] receivedBytes = null;
            IPEndPoint remoteIPEndPoint = null;
            DirMetadata directoryMetadata = new DirMetadata(metadataAsBytes);
            bool received = false;
            while (!received) {
                receivedBytes = target.Receive(ref remoteIPEndPoint);
                if (Utils.VerifyChecksum(receivedBytes)) {
                    if (receivedBytes[Constants.FIELD_TYPE] == Constants.TYPE_DIRECTORY_DELIVERY) {
                        AckPacket ack = new AckPacket(-1);
                        Utils.SendTo(target, ack.MyPacketAsBytes);
                        return false;
                    }
                    received = true;
                }

            }
            return ReceiveAllDirectoryPackets(receivedBytes, directoryMetadata, target);
        }
        private static void HandleFileGetRequest(UdpClient target)
        {
            IPEndPoint remoteIPEndPoint = null;
            Console.Write("Please enter a filepath\\filename: ");
            string name = Console.ReadLine();
            FileMetadataPacket pack = new FileMetadataPacket(Constants.TYPE_FILE_REQUEST, 0, name.Length, Encoding.Default.GetBytes(name), 0);
            byte[] receivedBytes = null;

            bool sent = false;

            Stopwatch timeout = new Stopwatch();
            byte[] backup = new byte[Constants.PACKET_SIZE];
            while (!sent) {
                for (int i = 0; i < Constants.PACKET_SIZE; i++) {
                    backup[i] = pack.MyPacketAsBytes[i];
                }
                Utils.SendTo(target, backup);
                timeout.Restart();
                while (timeout.ElapsedMilliseconds < Constants.PACKET_TIMEOUT_MILLISECONDS) {
                    if (target.Available != 0) {
                        receivedBytes = target.Receive(ref remoteIPEndPoint);

                        if (Utils.VerifyChecksum(receivedBytes)) {
                            if (receivedBytes[Constants.FIELD_TYPE] == Constants.TYPE_FILE_DELIVERY) {
                                sent = true;
                            }
                        }
                    }
                }
            }
            PingPong.SendAckTo(-1, target);

            bool success = false;
            while (!success) {
                AckPacket ack = new AckPacket(-1);
                Utils.SendTo(target, ack.MyPacketAsBytes);
                success = PingPong.ReceiveFileFrom(receivedBytes, target);
            }
            Console.WriteLine("File received successfully.");
        }
Beispiel #6
0
        public static void ReceiveFile(UdpClient udpSource, byte[] metadata)
        {
            int currentWorkingPacket = 0;
            int filenameSize = BitConverter.ToInt32(metadata, Constants.FIELD_FILENAME_LENGTH);
            int fileLength = BitConverter.ToInt32(metadata, Constants.FIELD_FILE_LENGTH);
            int packetTotal = BitConverter.ToInt32(metadata, Constants.FIELD_TOTAL_PACKETS);
            byte[] filenameBytes = new byte[filenameSize];
            for (int i = 0; i < filenameSize; i++) {
                filenameBytes[i] = metadata[i + Constants.FIELD_FILENAME];
            }
            string filename = Encoding.Unicode.GetString(filenameBytes);

            List<dataPacketBuffer> buffer = new List<dataPacketBuffer>();

            IPEndPoint remoteIPEndPoint = null;
            while (currentWorkingPacket < packetTotal) {
                byte[] receivedBytes = udpSource.Receive(ref remoteIPEndPoint);

                if (VerifyChecksum(receivedBytes)) {
                    byte[] payloadUnpacker = new byte[Constants.PAYLOAD_SIZE];
                    for (int i = 0; i < Constants.PAYLOAD_SIZE; i++) {
                        payloadUnpacker[i] = receivedBytes[i + Constants.FIELD_PAYLOAD];
                    }
                    dataPacketBuffer receivedPacket = new dataPacketBuffer(BitConverter.ToInt32(receivedBytes, Constants.FIELD_PACKET_ID), payloadUnpacker);

                    if (receivedPacket.getID() < currentWorkingPacket) {
                        AckPacket respond = new AckPacket(receivedPacket.getID());
                        SendTo(udpSource, respond.MakePacket());
                    }
                    else if (receivedPacket.getID() == currentWorkingPacket) {
                        File.AppendAllText(filename, Encoding.Default.GetString(payloadUnpacker));
                    }
                    else if (receivedPacket.getID() > currentWorkingPacket) {
                        buffer.Add(receivedPacket);
                    }
                }

                buffer.Sort(
                    delegate(dataPacketBuffer s1, dataPacketBuffer s2) {
                        return s1.getID().CompareTo(s2.getID());
                    }
                );
                foreach (dataPacketBuffer item in buffer) {
                    if (item.getID() == currentWorkingPacket) {
                        File.AppendAllText(filename, Encoding.Unicode.GetString(item.getPayload()));
                        buffer.Remove(item);
                        currentWorkingPacket++;
                    }
                }
            }
        }