FtpServer.cs
上传用户:xuelanruo
上传日期:2015-04-02
资源大小:163k
文件大小:6k
源码类别:

Ftp服务器

开发平台:

C#

  1. using System;
  2. using System.IO;
  3. using System.Data;
  4. using System.Collections;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Threading;
  8. using System.Security.Permissions;
  9. using System.Configuration;
  10. namespace FtpServerLibrary 
  11. {
  12. public class ConnectionEventArgs : EventArgs
  13. {
  14. string m_ip;
  15. public string Ip
  16. {
  17. get
  18. {
  19. return m_ip;
  20. }
  21. }
  22. public ConnectionEventArgs(string ip)
  23. {
  24. this.m_ip=ip;
  25. }
  26. }
  27. /// <summary>
  28. /// Code retour de lecture de commande
  29. /// </summary>
  30. public enum ReadReplyCode
  31. {
  32. Ok = 0,
  33. TimeOut = 1,
  34. UnknownError = 2
  35. }
  36. public class ReadException : System.Exception
  37. {
  38. private ReadReplyCode m_ReadReplyCode;
  39. public ReadException(ReadReplyCode code,string message) : base(message)
  40. {
  41. m_ReadReplyCode = code;
  42. }
  43. public ReadReplyCode ReadReplyCode
  44. {
  45. get{ return m_ReadReplyCode; }
  46. }
  47. }
  48. public class FtpServer
  49. {
  50. private TcpListener FTP_Listener = null;
  51. private Hashtable m_sessionList = null;
  52. private Hashtable m_sessionThreads = null;
  53. private Thread m_listeningThread = null;
  54. private bool m_listening = false;
  55. private long m_sessID     = 0;
  56. #region 属性
  57. public static void SetConfigValue(string Key, string Value)
  58. {
  59. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  60. AppSettingsSection appSettings = config.AppSettings as AppSettingsSection;
  61. appSettings.Settings[Key].Value = Value;
  62. appSettings.SectionInformation.ForceSave = true;
  63. config.Save(ConfigurationSaveMode.Modified);
  64. ConfigurationManager.RefreshSection("appSettings");
  65. }
  66. public string IPAddress
  67. {
  68. get
  69. {
  70. try
  71. {
  72. return ConfigurationManager.AppSettings["IPAddress"];
  73. }
  74. catch 
  75. {
  76. return "ALL";
  77. }
  78. }
  79. set
  80. {
  81. SetConfigValue("IPAddress", value);
  82. }
  83. }
  84. public int MaxBadCommands
  85. {
  86. get
  87. {
  88. try
  89. {
  90. return Convert.ToInt32(ConfigurationManager.AppSettings["MaxBadCommands"]);
  91. }
  92. catch
  93. {
  94. return 30;
  95. }
  96. }
  97. set
  98. {
  99. try
  100. {
  101. SetConfigValue("MaxBadCommands",((int)value).ToString());
  102. }
  103. catch
  104. {}
  105. }
  106. }
  107. public int Port
  108. {
  109. get
  110. {
  111. try
  112. {
  113. return Convert.ToInt32(ConfigurationManager.AppSettings["Port"]);
  114. }
  115. catch
  116. {
  117. return 21;
  118. }
  119. }
  120. set
  121. {
  122. try
  123. {
  124. SetConfigValue("Port",((int)value).ToString());
  125. }
  126. catch
  127. {
  128. }
  129. }
  130. }
  131. public int MaxThreads
  132. {
  133. get
  134. {
  135. try
  136. {
  137. return Convert.ToInt32(ConfigurationManager.AppSettings["MaxThreads"]);
  138. }
  139. catch
  140. {
  141. return 100;
  142. }
  143. }
  144. set
  145. {
  146. try
  147. {
  148. SetConfigValue("MaxThreads",((int)value).ToString());
  149. }
  150. catch
  151. {}
  152. }
  153. }
  154. public int SessionIdleTimeOut
  155. {
  156. get
  157. {
  158. try
  159. {
  160. return Convert.ToInt32(ConfigurationManager.AppSettings["SessionIdleTimeOut"]);
  161. }
  162. catch
  163. {
  164. return 800000;
  165. }
  166. }
  167. set
  168. {
  169. try
  170. {
  171. SetConfigValue("SessionIdleTimeOut",((int)value).ToString());
  172. }
  173. catch
  174. {}
  175. }
  176. }
  177. public int CommandIdleTimeOut
  178. {
  179. get
  180. {
  181. try
  182. {
  183. return Convert.ToInt32(ConfigurationManager.AppSettings["CommandIdleTimeOut"]);
  184. }
  185. catch
  186. {
  187. return 60000;
  188. }
  189. }
  190. set
  191. {
  192. try
  193. {
  194. SetConfigValue("CommandIdleTimeOut",((int)value).ToString());
  195. }
  196. catch
  197. {}
  198. }
  199. }
  200. #endregion
  201. #region 事件
  202. public delegate void ConnectionEventHandler(object sender, ConnectionEventArgs e);
  203. public event EventHandler Started;
  204. public event EventHandler Stopped;
  205. public event ConnectionEventHandler ClientConnected;
  206. public event ConnectionEventHandler ClientDisconected;
  207. #endregion
  208. public FtpServer()
  209. {
  210. }
  211. public void Start()
  212. {
  213. try
  214. {
  215. if(!this.m_listening)
  216. {
  217. this.m_sessionList=new Hashtable();
  218. this.m_sessionThreads=new Hashtable();
  219. this.m_listeningThread=new Thread(new ThreadStart(Listen));
  220. this.m_listeningThread.Start();
  221. if(this.Started!=null)
  222. {
  223. Started(this,EventArgs.Empty);
  224. }
  225. }
  226. }
  227. catch{}
  228. }
  229. public void Stop()
  230. {
  231. try
  232. {
  233. //on ne stop le thread que si il est en train de tourner
  234. if(this.m_listening)
  235. {
  236. //on stop le thread
  237. this.m_listeningThread.Abort();
  238. //on change la variable en cons閝uence
  239. this.m_listening=false;
  240. //on stop le listener
  241. FTP_Listener.Stop();
  242. //et on le d閠ruit
  243. FTP_Listener=null;
  244. //On arr阾e aussi toutes les sessions en cours
  245. for (int i=0; i<m_sessID; i++)
  246. {
  247. this.RemoveSession(i);
  248. }
  249. //on d閏lenche l'関鑞ement Stopped
  250. if(this.Stopped!=null)
  251. {
  252. Stopped(this,EventArgs.Empty);
  253. }
  254. }
  255. }
  256. catch{}
  257. }
  258. private void Listen()
  259. {
  260. if(this.IPAddress.ToLower().IndexOf("all") > -1)
  261. {
  262. FTP_Listener = new TcpListener(System.Net.IPAddress.Any,this.Port);
  263. }
  264. else
  265. {
  266. FTP_Listener = new TcpListener(System.Net.IPAddress.Parse(this.IPAddress),this.Port);
  267. }
  268. FTP_Listener.Start();
  269. this.m_listening=true;
  270. while(true)
  271. {
  272. if(m_sessionList.Count < this.MaxThreads)
  273. {
  274. Socket clientSocket = FTP_Listener.AcceptSocket();
  275. if(this.ClientConnected!=null)
  276. {
  277. this.ClientConnected(this,new ConnectionEventArgs(clientSocket.RemoteEndPoint.ToString()));
  278. }
  279. FtpSession session=new FtpSession(clientSocket,this,this.m_sessID);
  280. Thread clientThread = new Thread(new ThreadStart(session.StartProcessing));
  281. this.m_sessionList.Add(m_sessID,session);
  282. clientThread.Start();
  283. this.m_sessionThreads.Add(m_sessID,clientThread);
  284. m_sessID++;
  285. }
  286. else
  287. {
  288. Thread.Sleep(100);
  289. }
  290. }
  291. }
  292. public void RemoveSession(long sessID)
  293. {
  294. try
  295. {
  296. //Evenement ClientDisconnected
  297. if(this.ClientDisconected!=null)this.ClientDisconected(this,new ConnectionEventArgs(((FtpSession)this.m_sessionList[sessID]).RemoteEndPoint.ToString()));
  298. ((Thread)this.m_sessionThreads[sessID]).Abort();
  299. //suppression du thread
  300. this.m_sessionThreads.Remove(sessID);
  301. //Cloture de la session
  302. ((FtpSession)this.m_sessionList[sessID]).Close();
  303. //suppression de la session
  304. this.m_sessionList[sessID]=null;
  305. this.m_sessionList.Remove(sessID);
  306. }
  307. catch{};
  308. }
  309. }
  310. }