亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rudpstack.cs

?? rudp可靠保障得udp傳輸
?? CS
?? 第 1 頁 / 共 4 頁
字號:
//#define CONSOLE_TRACE
//#define CONSOLE_TRACE_MEMORY
//#define STATISTICS
//#define TEST_PACKETLOOSE

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;

using Helper.Threading.Collections;

namespace Helper.Net.RUDP
{

	#region Documentations

	/// <summary>
	/// Features :
	/// -------------
	/// 1 - Unreliable packets
	/// 2 - Reliable messaging (You are insured that the message arrives)
	/// 3 - Ordering messages delivery (Allow sending/receiving the messages in the same order)
	/// 4 - KeepAlive feature (to insure that there is no broken connection)
	/// 5 - Has a Tear down message (to close the connection gracefully)
	/// 6 - RendezVous mode and NAT traversal
	/// 7 - Packet fragmentation
	/// 8 - Sliding window (using slot technic)
	/// 9 - Piggy backing (ACK stored in packets)
	/// 10 - Multiples ACKs in a packet (Like SACK for TCP).
	/// 
	/// In progress :
	/// -------------
	/// 1 - Congestion Avoidance Problem :  http://www.cs.utk.edu/~dunigan/tcptour/javis/tcp_congavd.html
	///										http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html
	///										http://www.cs.cmu.edu/afs/cs/academic/class/15441-s06/lectures/L20-TCP-Congestion.pdf
	/// To do:
	/// ------
	/// 2 - Better errors management
	/// 3 - Bandwidth x Delay Product : http://www.cs.utk.edu/~dunigan/tcptour/javis/tcp_slidwin.html
	/// adapt the size of the congestion window. (And the Time out too)
	/// 4 - Slow start : http://www.cs.utk.edu/~dunigan/tcptour/javis/tcp_slowstart.html
	/// 5 - Fast Retransmit Algorithm : http://www.cs.utk.edu/~dunigan/tcptour/javis/tcp_fastrtx.html
	/// 6 - Fast-Recovery Algorithm : http://www.cs.utk.edu/~dunigan/tcptour/javis/tcp_fastrec.html
	/// 
	/// Improvement :
	/// -------------
	/// Optimization : http://gyroweb.inria.fr/~viennot/enseignement/projets/ltcodestcp/ltcodestcphevea.html
	/// Study UDT protocol to improve the used algorithms.
	/// Avoid SIN Attack : http://sewww.epfl.ch/SIC/SA/SPIP/Publications/IMG/pdf/9-3-page13.pdf
	/// http://www.microsoft.com/technet/technetmag/issues/2007/01/CableGuy/default.aspx?loc=fr
	/// Better NAT traversal : http://www.codeproject.com/useritems/STUN_client.asp
	/// 
	/// http://www.tcpipguide.com/free/index.htm
	///
	/// Documentation :
	/// ---------------
	// Test : http://www.pcausa.com/Utilities/pcattcp.htm
	///
	/// UDP server : http://clutch-inc.com/blog/?p=4
	///
	/// TCP: http://www.commentcamarche.net/internet/tcp.php3
	///		http://www.lri.fr/~colette/AnimationFlash/anim_TCP.swf
	///		http://iptables-tutorial.frozentux.net/fr/x1391.html
	///		http://en.wikipedia.org/wiki/Transmission_Control_Protocol
	///		http://www-lsr.imag.fr/users/Andrzej.Duda/PS/2-eme-annee/TCP.pdf
	///
	/// HSTCP: http://www.hep.ucl.ac.uk/~ytl/tcpip/highspeedtcp/hstcp/index.html
	///
	/// Based on TCP:
	/// ------------
	/// http://www.cs.utk.edu/~dunigan/tcptour/
	/// http://abcdrfc.free.fr/rfc-vf/rfc793.html (French)
	/// http://abcdrfc.free.fr/rfc-vf/pdf/rfc793.pdf
	///
	/// Some documentation at :
	/// -----------------------
	/// TCP :
	/// http://www.soi.wide.ad.jp/class/20020032/slides/11/index_32.html
	/// http://www.univ-orleans.fr/sciences/info/ressources/Modules/master2/cci_reseau/ccicours/ch3_couche_transport_1page.pdf
	/// 
	/// UDT :
	/// http://www.cs.uic.edu/~ygu/paper/udt-comnet-v3.pdf
	/// http://udt.sourceforge.net/doc/draft-gg-udt-01.txt
	/// http://www.cs.uic.edu/~ygu/paper/pfldnet04-udt-uic-anl.ppt
	/// </summary>

	#endregion

	#region Articles to improve this implementation

	// On Making TCP More Robust to Packet Reordering
	// http://216.239.59.104/search?q=cache:yL3n-wdnB4AJ:www.icir.org/mallman/papers/tcp-reorder-ccr.ps+tcp+several+ack+packet&hl=fr&ct=clnk&cd=7&gl=be
	// http://www.icir.org/mallman/papers/

	// UDT
	// http://udt.sf.net

	// Hyper Threading
	// http://www.intel.com/cd/ids/developer/asmo-na/eng/194566.htm?prn=Y

	// http://msdn.microsoft.com/msdnmag/issues/05/08/Concurrency/

	#endregion

	static public class RUDPStack
	{

		#region Variables

#if TEST_PACKETLOOSE
		static private Random _looseRandom = new Random();
#endif

		static private readonly bool IsSingleCpuMachine = (Environment.ProcessorCount == 1);

		static internal int UDPHeaderLength = 20 + 8; // 20 bytes for IP , 8 bytes for UDP 
		static internal int RUDPHeaderLength = 47; // 1 + 1 + 1 + 4 + 4 + 4 + 4 * 8

		// The time we wait before sending a keep alive message
		static internal long KeepAliveInterval = 9000000; // 9 seconds

		// The time we wait before a bandwith test
		static internal long BandwidthInterval = 1000000; // 1 second

		// Send ACK every 1 ms
		private const int DelayACKTime = 200000;

		//---- Stack Management
		static private volatile bool _isStackRunning;

		//---- The list of physical sockets, to manage mapping between RUDP and Physical
		static private Dictionary<IPEndPoint, PhysicalSocket> _physicals = new Dictionary<IPEndPoint, PhysicalSocket>(1000);

		//---- The list of logical sockets
		static private List<RUDPSocket> _rudpSockets = new List<RUDPSocket>();
		static private ReaderWriterLock _rudpSocketsLock = new ReaderWriterLock();

		//---- Timers
		static private Thread _protocolControlThread;

		#endregion

		#region Constructor

		static RUDPStack()
		{
			AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);

			//---- Timers
			_protocolControlThread = new Thread(new ThreadStart(HeartBeat));
			_isStackRunning = true;
			_protocolControlThread.Name = "RUDP Stack Control";
			_protocolControlThread.IsBackground = true;
			_protocolControlThread.Priority = ThreadPriority.Normal;

			// Just below normal to allow UDP stack to run
			_protocolControlThread.Start();
		}

		#endregion

		#region StopStack

		static internal void StopStack()
		{
			//---- Close all the connections
			_rudpSocketsLock.AcquireWriterLock(RUDPSocket.LockTimeOut);

			for (int index = _rudpSockets.Count - 1; index > -1; index--)
				Close(_rudpSockets[index]);

			_rudpSocketsLock.ReleaseWriterLock();

			//---- Stop everything
			_isStackRunning = false;
		}

		#endregion

		#region Instance Factory

		/// <summary>
		/// Static method to get/create a PhysicalSocket
		/// </summary>
		/// <param name="endPoint">The binded end point</param>
		internal static PhysicalSocket GetInstance(IPEndPoint endPoint)
		{
			lock (_physicals)
			{
				PhysicalSocket physical;

				bool isAnyEndPoint = endPoint.Equals(new IPEndPoint(IPAddress.Any, 0));

				// Check if there is already an existing instance
				if (!isAnyEndPoint)
				{
					if (_physicals.TryGetValue(endPoint, out physical))
						return physical;

					// In case no instance exists, create one
					physical = new PhysicalSocket();
					physical.Bind(endPoint);
					RegisterPhysicalSocket(physical);
					_physicals.Add(endPoint, physical);
				}
				else
				{
					physical = new PhysicalSocket();

					while (true)
					{
						int port = new Random().Next(Int16.MaxValue);
						IPAddress localAddress = LocalIPAddress(ProtocolType.IPv4);
						endPoint = new IPEndPoint(localAddress, port);

						// In case no instance exists, create one
						try
						{
							physical.Bind(endPoint);
							break;
						}
						catch { }
					}

					RegisterPhysicalSocket(physical);
					_physicals.Add(endPoint, physical);
				}

				return physical;
			}
		}

		/// <summary>
		/// Release a PhysicalSocket instance and all its resources.
		/// </summary>
		/// <param name="physical">The socket to release</param>
		internal static void ReleaseInstance(PhysicalSocket physical)
		{
			lock (_physicals)
			{
				physical.Dispose();
				_physicals.Remove((IPEndPoint)physical._socket.LocalEndPoint);
			}
		}

		#endregion

		#region RegisterPhysicalSocket

		static private void RegisterPhysicalSocket(PhysicalSocket physical)
		{
			EndPoint tempEndPoint = (EndPoint)physical._canReceiveFromEndPoint;
			physical._socket.BeginReceiveFrom(physical._receiveBuffer, 0, physical._receiveBuffer.Length, SocketFlags.None, ref tempEndPoint, new AsyncCallback(OnEndReceive), physical);
		}

		#endregion

		#region RegisterConnectedSocket

		internal static void RegisterRUDPSocket(RUDPSocket rudp)
		{
			_rudpSocketsLock.AcquireWriterLock(RUDPSocket.LockTimeOut);
			if (!_rudpSockets.Contains(rudp))
				_rudpSockets.Add(rudp);
			_rudpSocketsLock.ReleaseWriterLock();
		}

		internal static void UnregisterRUDPSocket(RUDPSocket rudp)
		{
			_rudpSocketsLock.AcquireWriterLock(RUDPSocket.LockTimeOut);
			_rudpSockets.Remove(rudp);
			_rudpSocketsLock.ReleaseWriterLock();
		}

		#endregion

		#region BeginConnect

		internal static RUDPSocketError BeginConnect(RUDPSocket rudp, int timeOut)
		{
			Trace("Connecting to :" + rudp._remoteEndPoint);

			if (rudp._status == RUDPSocketStatus.Connected)
				return RUDPSocketError.IsConnected;

			if (rudp._status == RUDPSocketStatus.Connecting)
				return RUDPSocketError.AlreadyInProgress;

			//---- Set the status
			rudp.Reset(RUDPSocketStatus.Connecting);

			//---- Register for the stack
			RUDPStack.RegisterRUDPSocket(rudp);

			//---- Send a ping
			if (rudp.IsRendezVousMode)
				PushPacketToSend(rudp, true, RUDPPacketChannel.PingRendezVous, null, 0, 0);
			else
				PushPacketToSend(rudp, true, RUDPPacketChannel.Ping, null, 0, 0);

			return RUDPSocketError.Success;
		}

		#endregion

		#region BeginAccept

		internal static bool BeginAccept(RUDPSocket rudp)
		{
			Trace("Accepting at :" + rudp._remoteEndPoint);

			if (rudp._status != RUDPSocketStatus.Accepting)
				return false;

			//---- Register for the stack
			RUDPStack.RegisterRUDPSocket(rudp);

			return true;
		}

		#endregion

		#region CurrentDomain_ProcessExit

		private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
		{
			// Try to shutdow gracefully, but it is not sure because the process is killed
			_rudpSocketsLock.AcquireWriterLock(RUDPSocket.LockTimeOut);

			for (int index = _rudpSockets.Count - 1; index > -1; index--)
				Shutdown(_rudpSockets[index]);

			_rudpSocketsLock.ReleaseWriterLock();
		}

		#endregion

		#region Close

		/// <summary>
		/// Close the socket. Send the tear down message.
		/// </summary>
		internal static void Close(RUDPSocket rudp)
		{
			if (rudp._status == RUDPSocketStatus.Closed)
				return;

			if (rudp._status == RUDPSocketStatus.Accepting)
			{
				rudp.Reset(RUDPSocketStatus.Closed);
				return;
			}

			AsyncShutdown(rudp);
		}

		private static void AsyncShutdown(RUDPSocket rudp)
		{
			ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncShutdownCB), rudp);
		}

		private static void AsyncShutdownCB(object state)
		{
			Shutdown((RUDPSocket)state);
		}

		#endregion

		#region Shutdown

		internal static void Shutdown(RUDPSocket rudp)
		{
			if (rudp._status == RUDPSocketStatus.Accepting)
			{
				rudp.Reset(RUDPSocketStatus.Closed);
				return;
			}

			if (rudp._status == RUDPSocketStatus.Closed ||
				rudp._isShutingDown)
				return;

			if (rudp._status == RUDPSocketStatus.Closing ||
				rudp._status == RUDPSocketStatus.ClosingACKed)
				return;

			if (rudp._status == RUDPSocketStatus.Connecting)
			{
				rudp.Reset(RUDPSocketStatus.Closed);
				return;
			}

			//---- Send the tear down message

			//-- Update the status
			rudp._isShutingDown = true;
			rudp._status = RUDPSocketStatus.Closing;

			//-- Wait for sending
			while (!rudp._controlWindow.CanSend(0))
			{
				if (rudp._status != RUDPSocketStatus.Closing)
					return;
				Thread.Sleep(100);
			}

			//-- Send the tear down message
			PushPacketToSend(rudp, true, RUDPPacketChannel.TearDown, null, 0, 0);

			//---- Currently closing the connection, wait for the end of the operation
			long startTime = HiResTimer.MicroSeconds;

			//-- Wait until closed
			// Wait until "ClosingACKed"
			// Wait until we have receive the "TearDown" message too and send the ACK
			// Wait until "Time out"
			while (rudp._status == RUDPSocketStatus.Closing &&
					rudp._sendingPackets.Count > 0 &&
					(HiResTimer.MicroSeconds - startTime) < rudp._sto)
			{
				Thread.Sleep(100);
			}

			//---- Set the status as closed
			rudp.Reset(RUDPSocketStatus.Closed);

			//---- Notify
			rudp._physical.OnDisconnected(rudp, RUDPSocketError.Shutdown);
		}

		#endregion

		#region SendPayload

		internal static RUDPSocketError SendPayload(RUDPSocket rudp, byte[] payload, int offset, int payloadLength, bool reliable, RUDPSendIAsyncResult asyncResult)
		{
			// We are no longer active
			if (!_isStackRunning)
				return RUDPSocketError.SystemNotReady;

			//---- Only when connected
			if (rudp._status != RUDPSocketStatus.Connected)
				return RUDPSocketError.NotConnected;

			//---- Fragmentation
			// Full header (IP + UDP + RUDP)
			int MSS = rudp._mtu - (RUDPStack.UDPHeaderLength + RUDPStack.RUDPHeaderLength);

			//---- Fragmentation
			asyncResult.ForceAsyncCall = true;
			FragmentInformation fragments = NewFragmentInformation(rudp, reliable, MSS, payload, offset, payloadLength, asyncResult);
			SendNextFragments(fragments, false);

			return fragments.Error;
		}

		#endregion

		#region SendNextFragments

		static private void SendNextFragments(object state, bool timeOut)
		{
			FragmentInformation fragment = state as FragmentInformation;

			while (fragment.Size > 0)
			{
				int currentLength = Math.Min(fragment.MTU, fragment.Size);

				//---- If cannot send, will send later
				if (fragment.IsReliable)
					if (/*fragment.IsInAsyncThread ||*/ fragment.AsyncResult == null)
					{
						while (!fragment.rudp._controlWindow.CanSend(currentLength))
							fragment.rudp._controlWindow.WaitObject.WaitOne();
					}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一二三四区在线| 欧美一区二区三区思思人| 欧美午夜免费电影| 国产午夜精品一区二区三区嫩草| 久久青草欧美一区二区三区| 亚洲欧美成aⅴ人在线观看| 韩国av一区二区三区| 欧美影院一区二区| 国产精品激情偷乱一区二区∴| 三级欧美在线一区| 国产不卡视频一区二区三区| 欧美日韩亚洲综合一区 | 一区二区激情小说| 丰满少妇久久久久久久| 精品对白一区国产伦| 蜜臀久久99精品久久久久久9| 欧美日韩在线不卡| 午夜久久久影院| 精品视频资源站| 一区二区成人在线| 色综合久久久网| 亚洲一区二区三区爽爽爽爽爽| av在线一区二区| 亚洲欧洲av在线| 99久久久国产精品免费蜜臀| 国产欧美一区视频| 一区二区日韩电影| 91福利在线观看| 日韩高清不卡一区二区| 日韩视频一区二区| 国产一区二区伦理片| 久久精品一区蜜桃臀影院| 99久久婷婷国产综合精品| 日韩精品亚洲一区二区三区免费| 精品国产乱码久久久久久闺蜜| 成人爱爱电影网址| 五月综合激情婷婷六月色窝| 久久久99精品久久| 制服丝袜一区二区三区| 91在线精品一区二区三区| 九色综合狠狠综合久久| 亚洲一区在线观看免费观看电影高清| 精品美女一区二区| 欧美视频第二页| 色综合天天综合网国产成人综合天| 久久精品国产亚洲5555| 日本亚洲欧美天堂免费| 亚洲综合另类小说| 亚洲国产欧美一区二区三区丁香婷| 欧美高清在线视频| 中文字幕欧美区| 中文字幕不卡三区| 欧美国产乱子伦| 欧美国产禁国产网站cc| 国产精品视频yy9299一区| 国产午夜精品久久久久久免费视| 精品国产乱码91久久久久久网站| 精品国产乱码久久久久久牛牛 | 国产伦精品一区二区三区免费迷 | 亚洲永久精品国产| 亚洲香肠在线观看| 一区二区在线观看免费视频播放| 中文字幕一区二区三区乱码在线| 欧美激情在线免费观看| 一区视频在线播放| 亚洲午夜在线观看视频在线| 日韩va亚洲va欧美va久久| 老司机午夜精品99久久| 国产剧情一区二区| caoporen国产精品视频| 欧美日韩电影在线播放| 精品国产91洋老外米糕| 日本一区二区三区dvd视频在线| 国产精品欧美一区二区三区| 亚洲人成伊人成综合网小说| 丝袜亚洲另类欧美综合| 国产揄拍国内精品对白| 欧美在线你懂的| 久久久久国产精品麻豆ai换脸 | 国产精品毛片久久久久久久| 亚洲免费在线电影| 国产在线精品视频| 色综合久久88色综合天天| 欧美一级二级三级乱码| 亚洲女与黑人做爰| 国产乱理伦片在线观看夜一区| 91成人在线精品| 国产精品污网站| 经典三级在线一区| 欧美精品第1页| 亚洲国产一区二区视频| 色婷婷久久久亚洲一区二区三区 | 久久久久久久久久久久电影| 一区二区三区高清不卡| 成人免费高清在线| 国产欧美日韩在线观看| 黑人巨大精品欧美一区| 欧美一区二区三区系列电影| 亚洲综合999| 欧美色图在线观看| 亚洲影院理伦片| 欧美图区在线视频| 亚洲妇熟xx妇色黄| 日本大香伊一区二区三区| 亚洲色图欧洲色图| 99re成人在线| 亚洲国产视频直播| 欧美精三区欧美精三区| 日韩高清在线不卡| 精品久久久久久久久久久院品网 | 免费人成精品欧美精品 | 国产日产亚洲精品系列| 不卡av电影在线播放| 亚洲黄一区二区三区| 欧美性感一类影片在线播放| 视频一区中文字幕国产| 精品国产凹凸成av人网站| 成人综合婷婷国产精品久久蜜臀| 国产精品私人影院| 欧美美女激情18p| 91丨porny丨在线| 亚洲综合成人网| 欧美国产日韩a欧美在线观看| kk眼镜猥琐国模调教系列一区二区 | 亚洲丝袜另类动漫二区| 欧美体内she精高潮| 九九热在线视频观看这里只有精品| 久久综合一区二区| 欧美羞羞免费网站| 国产99精品在线观看| 日韩国产在线观看| 亚洲欧洲日韩综合一区二区| 91精品国产综合久久久久久久| 岛国av在线一区| 久久国产剧场电影| 亚洲成av人影院| 亚洲日本va在线观看| 久久久精品黄色| 欧美精品乱码久久久久久 | 国产一区二区h| 另类的小说在线视频另类成人小视频在线 | 中文字幕在线一区免费| www日韩大片| 久久你懂得1024| 精品处破学生在线二十三| 5566中文字幕一区二区电影| 欧美性一二三区| 欧美视频精品在线观看| 欧美日韩成人高清| 欧美性xxxxxxxx| 日本韩国欧美一区| 在线免费观看日本一区| 色婷婷av一区二区三区大白胸| 91丨九色丨蝌蚪丨老版| 91欧美一区二区| 在线视频你懂得一区二区三区| 欧美性淫爽ww久久久久无| 欧美日韩国产高清一区二区三区| 欧美性生活影院| 日韩欧美久久一区| 亚洲国产岛国毛片在线| 成人欧美一区二区三区白人| 在线观看国产精品网站| 国产一区久久久| 成人在线一区二区三区| 色婷婷久久综合| 欧美日韩aaaaa| 国产欧美日韩另类一区| 亚洲视频一区二区在线| 日韩不卡一区二区| 成人免费看视频| 日韩三级在线免费观看| 国产精品美女久久久久久 | 亚洲老妇xxxxxx| 久久精品国产秦先生| 在线视频观看一区| 国产亚洲人成网站| 视频一区欧美精品| 国产成人a级片| 91精品欧美一区二区三区综合在| 中文字幕av一区 二区| 麻豆91在线播放| 正在播放亚洲一区| 一区二区三区在线观看欧美| 国产精品一区三区| 日韩精品一区二区三区在线观看| 亚洲国产成人午夜在线一区| 看国产成人h片视频| 欧美日韩免费在线视频| 亚洲精品国产a久久久久久| 99久久免费国产| 中文字幕五月欧美| 国产乱码精品一区二区三区av| 91精品国产免费| 日韩中文字幕区一区有砖一区| 在线亚洲免费视频| 亚洲国产成人va在线观看天堂| 91在线精品秘密一区二区| 中文字幕一区二区三区在线不卡| 粉嫩蜜臀av国产精品网站|