コード例 #1
0
        public void WaitForSynAck()
        {
            EndPoint sender = (EndPoint)_endPoint;
            var      ackn   = new byte[RPH.GetPacketByteLength()];

            // set the timeout for receiving acks (retransmission timeout)
            _sendingSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, Timeout);
            try
            {
                _sendingSocket.ReceiveFrom(ackn, ref sender);

                var rph = RPH.Deserialize(ackn);
                if (IsCorrupt(rph) || !IsSynAck(rph))
                {
                    _currentState = State.EstablishConnection;
                    return;
                }
                else
                {
                    Console.WriteLine("Connection Established");
                    _currentState = State.SendPacket;
                }
            }
            catch (SocketException e)
            {
                if (e.SocketErrorCode == SocketError.TimedOut)
                {
                    Console.WriteLine(e.ToString());
                    Console.WriteLine("No Connection could be established");
                }
                _currentState = State.EstablishConnection;
            }
        }
コード例 #2
0
        public void SetChecksum(ref byte[] packet)
        {
            RPH rph = RPH.Deserialize(packet);
            var md5 = MD5.Create();

            rph._checksum = BitConverter.ToInt32(md5.ComputeHash(packet), 0);
            byte[] newHead = rph.Serialize();
            Array.Copy(newHead, packet, newHead.Length);
        }
コード例 #3
0
        private void WaitForAck()
        {
            EndPoint sender = (EndPoint)_endPoint;
            var      ackn   = new byte[RPH.GetPacketByteLength()];

            _tries++;

            if (MaxRetransTries < _tries)
            {
                _currentState = State.FatalError;
                return;
            }

            try
            {
                _sendingSocket.ReceiveFrom(ackn, ref sender);

                var rph = RPH.Deserialize(ackn);

                // Ack is corrupt
                if (IsCorrupt(rph, ackn) || !IsAck(rph))
                {
                    // If Ack is corrupt resend Packet
                    Console.WriteLine("Corrupt or NAck: Resend Packet");
                }
                else if (IsAck(rph) && !IsCorrupt(rph) && rph._ackNr != _localSeqNr)
                {
                    _tries = 0;
                    Debug.Assert(rph != null, "rph != null");
                    _localSeqNr  += _filechunk.Length;
                    _currentState = State.SendPacket;
                }
                else
                {
                    Console.WriteLine("Not defined");
                }
            }
            catch (SocketException e)
            {
                if (e.SocketErrorCode == SocketError.TimedOut)
                {
                    // Timeout: Resend Packet
                    Console.WriteLine("Timeout: Resend Packet");
                    SendOnePacket();
                }
                else
                {
                    Console.WriteLine("Fatal Error");
                    _currentState = State.FatalError;
                    return;
                }
            }
        }
コード例 #4
0
        public bool IsCorrupt(RPH rph, byte[] packet)
        {
            var copyPacket = new byte[packet.Length];

            Array.Copy(packet, copyPacket, packet.Length);
            var recvRph      = RPH.Deserialize(packet);
            int recvChecksum = recvRph._checksum;

            recvRph._checksum = 0;
            byte[] newHead = recvRph.Serialize();
            Array.Copy(newHead, copyPacket, newHead.Length);
            var md5          = MD5.Create();
            int calcChecksum = BitConverter.ToInt32(md5.ComputeHash(copyPacket), 0);

            return(calcChecksum != recvChecksum);
        }