public bool RetransmitPacket(RdpeudpPacket packet)
{
if (!connected ||
packet.sourceHeader == null) return false;
if (!outPacketDic.ContainsKey(packet.sourceHeader.Value.snSourceStart))
{
return false;
}
if (outPacketDic[packet.sourceHeader.Value.snSourceStart].retransmitTimes >= this.SocketConfig.retransmitLimit)
{
//If a datagram has been retransmitted five times without a response, the sender terminates the connection
this.Close();
}
RDPUDP_SOURCE_PAYLOAD_HEADER sourceHeader = packet.sourceHeader.Value;
Monitor.Enter(sequenceNumberLock);
sourceHeader.snCoded = ++CurSnCoded;
Monitor.Exit(sequenceNumberLock);
packet.sourceHeader = sourceHeader;
byte[] data = PduMarshaler.Marshal(packet, false);
SendBytesByUDP(data);
lock (outPacketDic) // Deal with outPacketDic and retransmit packet.
{
if (outPacketDic.ContainsKey(packet.sourceHeader.Value.snSourceStart))
{
outPacketDic[packet.sourceHeader.Value.snSourceStart].retransmitTimes++;
outPacketDic[packet.sourceHeader.Value.snSourceStart].SendTime = DateTime.Now;
}
}
return true;
}