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; } }
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); }
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; } } }
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); }