Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.29 KB | None | 0 0
  1. using MetroFramework.Forms;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using System.Net.Sockets;
  11. using System.Net;
  12. using System.IO;
  13. using System.Runtime.Serialization.Formatters.Binary;
  14. using Shared;
  15. using Shared.Models;
  16.  
  17.  
  18.  
  19.  
  20. namespace Simulator.GUI
  21. {
  22.  
  23.  
  24.  
  25. public partial class StartTest : MetroForm
  26. {
  27. public int netStatus = 0;
  28. TcpSendFiles.TcpModule _tcpmodule;
  29. string secondName = "";
  30. string firstName = "";
  31. string group = "";
  32. public StartTest(string v)
  33. {
  34. InitializeComponent();
  35. _tcpmodule = new TcpSendFiles.TcpModule();
  36. label1.Hide();
  37. _tcpmodule.Receive += new TcpSendFiles.TcpModule.ReceiveEventHandler(_tcpmodule_Receive);
  38.  
  39. }
  40.  
  41. private void StartTest_Load(object sender, EventArgs e)
  42. {
  43.  
  44. }
  45.  
  46. private void WaitNSeconds(int segundos)
  47. {
  48. if (segundos < 1) return;
  49. DateTime _desired = DateTime.Now.AddSeconds(segundos);
  50. while (DateTime.Now < _desired)
  51. {
  52. System.Windows.Forms.Application.DoEvents();
  53. }
  54. }
  55.  
  56. private void StartButton_Click(object sender, EventArgs e)
  57. {
  58. secondName = secondNameTextBox.Text;
  59. firstName = firstNameTextBox.Text;
  60. group = groupTextBox.Text;
  61. _tcpmodule.connectionStatus = 0;
  62. netStatus = 0;
  63. _tcpmodule.ConnectClient("127.0.0.1");
  64. label1.Location = new Point(138, 333);
  65. label1.Text = "Попытка подключения...";
  66. label1.Show();
  67. StartButton.Enabled = false;
  68. WaitNSeconds(5);
  69. if (_tcpmodule._tcpClient.tcpClient.Connected == false)
  70. {
  71. label1.Location = new Point(117, 333);
  72. label1.Text = "Ошибка подключения к серверу";
  73. label1.Show();
  74. StartButton.Enabled = true;
  75. }
  76. else
  77. {
  78. label1.Location = new Point(88, 333);
  79. label1.Text = "Ожидание запуска теста преподавателем";
  80. label1.Show();
  81. StartButton.Enabled = false;
  82. }
  83.  
  84.  
  85.  
  86.  
  87. }
  88.  
  89. private void label1_Click(object sender, EventArgs e)
  90. {
  91.  
  92. }
  93.  
  94. void _tcpmodule_Receive(object sender, TcpSendFiles.ReceiveEventArgs e)
  95. {
  96.  
  97.  
  98. sendInfoSpace.Settings _settings = _tcpmodule.tcpSI.settings;
  99. sendInfoSpace.Exam _exam = _tcpmodule.tcpSI.exam;
  100.  
  101. Settings sendSettings = new Settings { CandidateName = "A" };
  102. Exam sendExam = new Exam();
  103.  
  104. sendSettings.CandidateName = _settings.CandidateName;
  105. sendSettings.ElapsedTime = _settings.ElapsedTime;
  106. sendSettings.NumberOfCorrectAnswers = _settings.NumberOfCorrectAnswers;
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. for (int i = 0; i < _settings.Questions.Count; i++)
  115. {
  116. sendSettings.Questions.Add(new Shared.Question());
  117. sendSettings.Questions[i].Answer = _settings.Questions[i].Answer;
  118. sendSettings.Questions[i].Answers = _settings.Questions[i].Answers;
  119. sendSettings.Questions[i].Explanation = _settings.Questions[i].Explanation;
  120. sendSettings.Questions[i].Image = _settings.Questions[i].Image;
  121. sendSettings.Questions[i].IsMultipleChoice = _settings.Questions[i].IsMultipleChoice;
  122. sendSettings.Questions[i].No = _settings.Questions[i].No;
  123. //sendSettings.Questions[i].Options = _settings.Questions[i].Options;
  124.  
  125. for (int j = 0; j < _settings.Questions[i].Options.Count; j++)
  126. {
  127. sendSettings.Questions[i].Options.Add(new Shared.Option());
  128. sendSettings.Questions[i].Options[j].Alphabet = _settings.Questions[i].Options[j].Alphabet;
  129. sendSettings.Questions[i].Options[j].Text = _settings.Questions[i].Options[j].Text;
  130. }
  131. sendSettings.Questions[i].Text = _settings.Questions[i].Text;
  132. }
  133.  
  134. sendSettings.ResultSpread = _settings.ResultSpread;
  135. //sendSettings.Sections = _settings.Sections;
  136.  
  137. for (int i = 0; i < _settings.Sections.Count; i++)
  138. {
  139. sendSettings.Sections.Add(new Shared.Section());
  140. sendSettings.Sections[i].Title = _settings.Sections[i].Title;
  141. //sendSettings.Sections[i].Questions
  142.  
  143. for (int j = 0; j < _settings.Sections[i].Questions.Count; j++)
  144. {
  145. sendSettings.Sections[i].Questions.Add(new Shared.Question());
  146. sendSettings.Sections[i].Questions[j].Answer = _settings.Sections[i].Questions[j].Answer;
  147. sendSettings.Sections[i].Questions[j].Answers = _settings.Sections[i].Questions[j].Answers;
  148. sendSettings.Sections[i].Questions[j].Explanation = _settings.Sections[i].Questions[j].Explanation;
  149. sendSettings.Sections[i].Questions[j].Image = _settings.Sections[i].Questions[j].Image;
  150. sendSettings.Sections[i].Questions[j].IsMultipleChoice = _settings.Sections[i].Questions[j].IsMultipleChoice;
  151. sendSettings.Sections[i].Questions[j].No = _settings.Sections[i].Questions[j].No;
  152. //sendSettings.Sections[i].Questions[j].Options = _settings.Sections[i].Questions[j].Options;
  153.  
  154. for (int k = 0; k < _settings.Sections[i].Questions[j].Options.Count; k++)
  155. {
  156. sendSettings.Sections[i].Questions[j].Options.Add(new Shared.Option());
  157. sendSettings.Sections[i].Questions[j].Options[k].Alphabet = _settings.Sections[i].Questions[j].Options[k].Alphabet;
  158. sendSettings.Sections[i].Questions[j].Options[k].Text = _settings.Sections[i].Questions[j].Options[k].Text;
  159. }
  160. sendSettings.Sections[i].Questions[j].Text = _settings.Sections[i].Questions[j].Text;
  161. }
  162. }
  163.  
  164. sendSettings.TimeLimit = _settings.TimeLimit;
  165.  
  166. sendExam.Properties.Title = _exam.Properties.Title;
  167. sendExam.Properties.Code = _exam.Properties.Code;
  168. sendExam.Properties.Version = _exam.Properties.Version;
  169. sendExam.Properties.Passmark = _exam.Properties.Passmark;
  170. sendExam.Properties.TimeLimit = _exam.Properties.TimeLimit;
  171. sendExam.Properties.Instructions = _exam.Properties.Instructions;
  172.  
  173. for (int i = 0; i < _exam.Sections.Count; i++)
  174. {
  175. sendExam.Sections.Add(new Shared.Section());
  176. sendExam.Sections[i].Title = _exam.Sections[i].Title;
  177. //sendExam.Sections[i].Questions
  178.  
  179. for (int j = 0; j < _exam.Sections[i].Questions.Count; j++)
  180. {
  181. sendExam.Sections[i].Questions.Add(new Shared.Question());
  182. sendExam.Sections[i].Questions[j].Answer = _exam.Sections[i].Questions[j].Answer;
  183. sendExam.Sections[i].Questions[j].Answers = _exam.Sections[i].Questions[j].Answers;
  184. sendExam.Sections[i].Questions[j].Explanation = _exam.Sections[i].Questions[j].Explanation;
  185. sendExam.Sections[i].Questions[j].Image = _exam.Sections[i].Questions[j].Image;
  186. sendExam.Sections[i].Questions[j].IsMultipleChoice = _exam.Sections[i].Questions[j].IsMultipleChoice;
  187. sendExam.Sections[i].Questions[j].No = _exam.Sections[i].Questions[j].No;
  188. //sendExam.Sections[i].Questions[j].Options = _exam.Sections[i].Questions[j].Options;
  189.  
  190. for (int k = 0; k < _exam.Sections[i].Questions[j].Options.Count; k++)
  191. {
  192. sendExam.Sections[i].Questions[j].Options.Add(new Shared.Option());
  193. sendExam.Sections[i].Questions[j].Options[k].Alphabet = _exam.Sections[i].Questions[j].Options[k].Alphabet;
  194. sendExam.Sections[i].Questions[j].Options[k].Text = _exam.Sections[i].Questions[j].Options[k].Text;
  195. }
  196.  
  197. sendExam.Sections[i].Questions[j].Text = _exam.Sections[i].Questions[j].Text;
  198. }
  199. }
  200.  
  201. //_tcpmodule.fileName = e.sendInfo.filename;
  202.  
  203. AssessmentUi ui = new AssessmentUi(sendExam, sendSettings,_tcpmodule, firstNameTextBox.Text,secondNameTextBox.Text,groupTextBox.Text);
  204. ui.ShowDialog();
  205. //Close();
  206.  
  207.  
  208. }
  209. }
  210. }
  211.  
  212.  
  213.  
  214.  
  215.  
  216. static class global
  217. {
  218. public const int MAXBUFFER = 1048576;
  219. public const int LENGTHHEADER = 9; // установленный размер главного заголовка
  220. }
  221.  
  222.  
  223. namespace TcpSendFiles
  224. {
  225. public class ReceiveEventArgs : EventArgs
  226. {
  227. private sendInfoSpace.SendInfo _sendinfo;
  228.  
  229. public ReceiveEventArgs(sendInfoSpace.SendInfo sendinfo)
  230. {
  231. _sendinfo = sendinfo;
  232. }
  233.  
  234. public sendInfoSpace.SendInfo sendInfo
  235. {
  236. get { return _sendinfo; }
  237. }
  238.  
  239. }
  240.  
  241. public class TcpModule
  242. {
  243. public int connectionStatus =0;
  244. public string fileName = "";
  245.  
  246. public sendInfoSpace.SendInfo tcpSI;
  247.  
  248. #region Определение событий сетевого модуля
  249.  
  250. // Типы делегатов для обработки событий в паре с соответствующим объектом события.
  251.  
  252. // Обработчики события акцептирования (принятия клиентов) прослушивающим сокетом
  253. public delegate void AcceptEventHandler(object sender);
  254. public event AcceptEventHandler Accept;
  255.  
  256. // Обработчики события подключения клиента к серверу
  257. public delegate void ConnectedEventHandler(object sender, string result);
  258. public event ConnectedEventHandler Connected;
  259.  
  260. // Обработчики события отключения конечных точек (клиентов или сервера)
  261. public delegate void DisconnectedEventHandler(object sender, string result);
  262. public event DisconnectedEventHandler Disconnected;
  263.  
  264. // Обработчики события извлечения данных
  265. public delegate void ReceiveEventHandler(object sender, ReceiveEventArgs e);
  266. public event ReceiveEventHandler Receive;
  267.  
  268. #endregion
  269.  
  270.  
  271. #region Объявления членов класса
  272.  
  273. // Родительская форма необходима для визуальной информации
  274. // о внутреннем состоянии и событиях работы сетвого модуля.
  275.  
  276. // Прослушивающий сокет для работы модуля в режиме сервера TCP
  277. private TcpListener _tcpListener;
  278.  
  279. // Удобный контейнер для подключенного клиента.
  280. public TcpClientData _tcpClient;
  281.  
  282. /// <summary>
  283. /// Возможные режимы работы TCP модуля
  284. /// </summary>
  285. public enum Mode { indeterminately, Server, Client };
  286.  
  287. /// <summary>
  288. /// Режим работы TCP модуля
  289. /// </summary>
  290. public Mode modeNetwork;
  291.  
  292. #endregion
  293.  
  294.  
  295. #region Интерфейсная часть TCP модуля
  296.  
  297. /// <summary>
  298. /// Запускает сервер, прослушивающий все IP адреса, и одновременно
  299. /// метод асинхронного принятия (акцептирования) клиентов.
  300. /// </summary>
  301. public void StartServer()
  302. {
  303. if (modeNetwork == Mode.indeterminately)
  304. {
  305. try
  306. {
  307. _tcpListener = new TcpListener(IPAddress.Any, 15000);
  308. _tcpListener.Start();
  309. _tcpListener.BeginAcceptTcpClient(AcceptCallback, _tcpListener);
  310. modeNetwork = Mode.Server;
  311.  
  312. }
  313. catch (Exception e)
  314. {
  315. _tcpListener = null;
  316. }
  317. }
  318. else
  319. {
  320. SoundError();
  321. }
  322. }
  323.  
  324.  
  325. /// <summary>
  326. /// Остановка сервера
  327. /// </summary>
  328. public void StopServer()
  329. {
  330. if (modeNetwork == Mode.Server)
  331. {
  332. modeNetwork = Mode.indeterminately;
  333. _tcpListener.Stop();
  334. _tcpListener = null;
  335.  
  336.  
  337. DeleteClient(_tcpClient);
  338.  
  339.  
  340. // Parent.ChangeBackColor(Color.FromKnownColor(KnownColor.Control));
  341. }
  342. }
  343.  
  344.  
  345. /// <summary>
  346. /// Попытка асинхронного подключения клиента к серверу
  347. /// </summary>
  348. /// <param name="ipserver">IP адрес сервера</param>
  349. public void ConnectClient(string ipserver)
  350. {
  351. if (modeNetwork == Mode.indeterminately)
  352. {
  353. _tcpClient = new TcpClientData();
  354. _tcpClient.tcpClient.BeginConnect(IPAddress.Parse(ipserver), 15000, new AsyncCallback(ConnectCallback), _tcpClient);
  355.  
  356. modeNetwork = Mode.Client;
  357.  
  358.  
  359. }
  360. else
  361. {
  362. SoundError();
  363. }
  364. }
  365.  
  366.  
  367. /// <summary>
  368. /// Отключение клиента от сервера
  369. /// </summary>
  370. public void DisconnectClient()
  371. {
  372. if (modeNetwork == Mode.Client)
  373. {
  374. modeNetwork = Mode.indeterminately;
  375. DeleteClient(_tcpClient);
  376. }
  377. }
  378.  
  379.  
  380. /// <summary>
  381. /// Завершение работы подключенного клиента
  382. /// </summary>
  383. private void DeleteClient(TcpClientData mtc)
  384. {
  385. if (mtc != null && mtc.tcpClient.Connected == true)
  386. {
  387. mtc.tcpClient.GetStream().Close(); // по настоянию MSDN закрываем поток отдельно у клиента
  388. mtc.tcpClient.Close(); // затем закрываем самого клиента
  389. }
  390. }
  391.  
  392.  
  393. /// <summary>
  394. /// Метод упрощенного создания заголовка с информацией о размере данных отправляемых по сети.
  395. /// </summary>
  396. /// <param name="length">длина данных подготовленных для отправки по сети</param>
  397. /// <returns>возращает байтовый массив заголовка</returns>
  398. private byte[] GetHeader(int length)
  399. {
  400. string header = length.ToString();
  401. if (header.Length < 9)
  402. {
  403. string zeros = null;
  404. for (int i = 0; i < (9 - header.Length); i++)
  405. {
  406. zeros += "0";
  407. }
  408. header = zeros + header;
  409. }
  410.  
  411. byte[] byteheader = Encoding.Default.GetBytes(header);
  412.  
  413.  
  414. return byteheader;
  415. }
  416.  
  417.  
  418.  
  419. public string SendFileName = null;
  420. public void SendData(string text = "")
  421. {
  422. // Состав отсылаемого универсального сообщения
  423. // 1. Заголовок о следующим объектом класса подробной информации дальнейших байтов
  424. // 2. Объект класса подробной информации о следующих байтах
  425. // 3. Байты непосредственно готовых к записи в файл или для чего-то иного.
  426.  
  427. sendInfoSpace.SendInfo si = new sendInfoSpace.SendInfo();
  428. //si.message = Parent.textBoxSend.Text;
  429. si.message = text;
  430.  
  431.  
  432. // Если нет сообщения и отсылаемого файла продолжать процедуру отправки нет смысла.
  433. if (String.IsNullOrEmpty(si.message) == true && String.IsNullOrEmpty(SendFileName) == true) return;
  434.  
  435. if (SendFileName != null)
  436. {
  437. FileInfo fi = new FileInfo(SendFileName);
  438. if (fi.Exists == true)
  439. {
  440. si.filesize = (int)fi.Length;
  441. si.filename = fi.Name;
  442. }
  443. fi = null;
  444. }
  445.  
  446. BinaryFormatter bf = new BinaryFormatter();
  447. MemoryStream ms = new MemoryStream();
  448. bf.Serialize(ms, si);
  449. ms.Position = 0;
  450. byte[] infobuffer = new byte[ms.Length];
  451. int r = ms.Read(infobuffer, 0, infobuffer.Length);
  452. ms.Close();
  453.  
  454. byte[] header = GetHeader(infobuffer.Length);
  455. byte[] total = new byte[header.Length + infobuffer.Length + si.filesize];
  456.  
  457. Buffer.BlockCopy(header, 0, total, 0, header.Length);
  458. Buffer.BlockCopy(infobuffer, 0, total, header.Length, infobuffer.Length);
  459.  
  460. // Если путь файла указан, добавим его содержимое в отправляемый массив байтов
  461. if (si.filesize > 0)
  462. {
  463. FileStream fs = new FileStream(SendFileName, FileMode.Open, FileAccess.Read);
  464. fs.Read(total, header.Length + infobuffer.Length, si.filesize);
  465. fs.Close();
  466. fs = null;
  467. }
  468.  
  469. // Отправим данные подключенным клиентам
  470. NetworkStream ns = _tcpClient.tcpClient.GetStream();
  471. // Так как данный метод вызывается в отдельном потоке рациональней использовать синхронный метод отправки
  472. ns.Write(total, 0, total.Length);
  473.  
  474. // Обнулим все ссылки на многобайтные объекты и попробуем очистить память
  475. header = null;
  476. infobuffer = null;
  477. total = null;
  478. SendFileName = null;
  479. // Parent.labelFileName.Text = "";
  480. GC.Collect();
  481. GC.WaitForPendingFinalizers();
  482.  
  483. // Подтверждение успешной отправки
  484. //Parent.ShowReceiveMessage("Данные успешно отправлены!");
  485. }
  486.  
  487.  
  488. /// <summary>
  489. /// Универсальный метод останавливающий работу сервера и закрывающий все сокетыю
  490. /// вызывается в событии закрытия родительской формы.
  491. /// </summary>
  492. public void CloseSocket()
  493. {
  494. StopServer();
  495. DisconnectClient();
  496. }
  497.  
  498. /// <summary>
  499. /// Звуковое сопровождение ошибок.
  500. /// </summary>
  501. private void SoundError()
  502. {
  503. Console.Beep(3000, 30);
  504. Console.Beep(1000, 30);
  505. }
  506.  
  507. #endregion
  508.  
  509.  
  510. #region Асинхронные методы сетевой работы TCP модуля
  511.  
  512.  
  513. /// <summary>
  514. /// Обратный метод завершения принятия клиентов
  515. /// </summary>
  516. public void AcceptCallback(IAsyncResult ar)
  517. {
  518. if (modeNetwork == Mode.indeterminately) return;
  519.  
  520. TcpListener listener = (TcpListener)ar.AsyncState;
  521. try
  522. {
  523. _tcpClient = new TcpClientData();
  524. _tcpClient.tcpClient = listener.EndAcceptTcpClient(ar);
  525.  
  526.  
  527. // Немедленно запускаем асинхронный метод извлечения сетевых данных
  528. // для акцептированного TCP клиента
  529. NetworkStream ns = _tcpClient.tcpClient.GetStream();
  530. _tcpClient.buffer = new byte[global.LENGTHHEADER];
  531. ns.BeginRead(_tcpClient.buffer, 0, _tcpClient.buffer.Length, new AsyncCallback(ReadCallback), _tcpClient);
  532.  
  533.  
  534. // Продолжаем ждать запросы на подключение
  535. listener.BeginAcceptTcpClient(AcceptCallback, listener);
  536.  
  537. // Активация события успешного подключения клиента
  538. if (Accept != null)
  539. {
  540. Accept.BeginInvoke(this, null, null);
  541. }
  542. }
  543. catch
  544. {
  545. // Обработка исключительных ошибок возникших при акцептирования клиента.
  546. SoundError();
  547. }
  548. }
  549.  
  550.  
  551. /// <summary>
  552. /// Метод вызываемый при завершении попытки поключения клиента
  553. /// </summary>
  554. public void ConnectCallback(IAsyncResult ar)
  555. {
  556. string result = "Подключение успешно!";
  557. try
  558. {
  559. // Получаем подключенного клиента
  560. TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;
  561. NetworkStream ns = myTcpClient.tcpClient.GetStream();
  562. myTcpClient.tcpClient.EndConnect(ar);
  563.  
  564. // Запускаем асинхронный метод чтения сетевых данных для подключенного TCP клиента
  565. myTcpClient.buffer = new byte[global.LENGTHHEADER];
  566. ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);
  567. // Parent.ChangeBackColor(Color.Goldenrod);
  568.  
  569. }
  570. catch (Exception e)
  571. {
  572. connectionStatus = 0;
  573. // MessageBox.Show("Ошибка подключения к серверу");
  574.  
  575. // Обработка ошибок подключения
  576. DisconnectClient();
  577. result = "Подключение провалено!";
  578.  
  579. SoundError();
  580. connectionStatus = 0;
  581.  
  582. }
  583.  
  584. // Активация события успешного или неуспешного подключения к серверу,
  585. // здесь серверу можно отослать ознакомительные данные о себе (например, имя клиента)
  586. if (Connected != null)
  587. {
  588. connectionStatus = 0;
  589. Connected.BeginInvoke(this, result, null, null);
  590. }
  591. else
  592. {
  593. connectionStatus = 1;
  594. }
  595.  
  596. }
  597.  
  598.  
  599. /// <summary>
  600. /// Метод асинхронно вызываемый при наличие данных в буферах приема.
  601. /// </summary>
  602.  
  603. public void ReadCallback(IAsyncResult ar)
  604. {
  605. if (modeNetwork == Mode.indeterminately) return;
  606.  
  607. TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;
  608.  
  609. try
  610. {
  611. NetworkStream ns = myTcpClient.tcpClient.GetStream();
  612.  
  613. int r = ns.EndRead(ar);
  614.  
  615. if (r > 0)
  616. {
  617. // Из главного заголовка получим размер массива байтов информационного объекта
  618. string header = Encoding.Default.GetString(myTcpClient.buffer);
  619. int leninfo = int.Parse(header);
  620.  
  621. // Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета
  622. MemoryStream ms = new MemoryStream(leninfo);
  623. byte[] temp = new byte[leninfo];
  624. r = ns.Read(temp, 0, temp.Length);
  625. ms.Write(temp, 0, r);
  626. BinaryFormatter bf = new BinaryFormatter();
  627. ms.Position = 0;
  628. sendInfoSpace.SendInfo sc = (sendInfoSpace.SendInfo)bf.Deserialize(ms);
  629. tcpSI = sc;
  630. ms.Close();
  631.  
  632. if (sc.filesize > 0)
  633. {
  634. // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации
  635. FileStream fs = new FileStream(sc.filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize);
  636. do
  637. {
  638. temp = new byte[global.MAXBUFFER];
  639. r = ns.Read(temp, 0, temp.Length);
  640.  
  641. // Записываем строго столько байтов сколько прочтено методом Read()
  642. fs.Write(temp, 0, r);
  643.  
  644. // Как только получены все байты файла, останавливаем цикл,
  645. // иначе он заблокируется в ожидании новых сетевых данных
  646. if (fs.Length == sc.filesize)
  647. {
  648. fs.Close();
  649. fs = null;
  650. break;
  651. }
  652. }
  653. while (r > 0);
  654.  
  655. temp = null;
  656. GC.Collect();
  657. GC.WaitForPendingFinalizers();
  658. }
  659.  
  660.  
  661.  
  662.  
  663. if (Receive != null)
  664. Receive(this, new ReceiveEventArgs(sc));
  665.  
  666. myTcpClient.buffer = new byte[global.LENGTHHEADER];
  667. ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);
  668.  
  669. }
  670. else
  671. {
  672. DeleteClient(myTcpClient);
  673.  
  674. // Событие клиент отключился
  675. if (Disconnected != null)
  676. Disconnected.BeginInvoke(this, "Клиент отключился!", null, null);
  677. }
  678. }
  679. catch (Exception e)
  680. {
  681.  
  682. DeleteClient(myTcpClient);
  683.  
  684.  
  685. // Событие клиент отключился
  686. if (Disconnected != null)
  687. Disconnected.BeginInvoke(this, "Клиент отключился аварийно!", null, null);
  688.  
  689. SoundError();
  690.  
  691. }
  692.  
  693. }
  694.  
  695.  
  696. #endregion
  697.  
  698. }
  699.  
  700.  
  701.  
  702. ///////////////////////////////////////////////////////////////////////////
  703. // ВСПОМОГАТЕЛЬНЫЕ КЛАССЫ ДЛЯ ОРГАНИЗАЦИИ СЕТЕВОЙ РАБОТЫ TCP МОДУЛЯ
  704. ///////////////////////////////////////////////////////////////////////////
  705.  
  706. /// <summary>
  707. /// Класс для организации непрерывного извлечения сетевых данных,
  708. /// для чего необходимо, как минимум, одновременно TcpClient
  709. /// и буфер приема.
  710. /// </summary>
  711. public class TcpClientData
  712. {
  713. public TcpClient tcpClient = new TcpClient();
  714.  
  715. // Буфер для чтения и записи данных сетевого потока
  716. public byte[] buffer = null;
  717.  
  718. public TcpClientData()
  719. {
  720. tcpClient.ReceiveBufferSize = global.MAXBUFFER;
  721. }
  722. }
  723.  
  724.  
  725. /// <summary>
  726. /// Класс для отправки текстового сообщения и
  727. /// информации о пересылаемых байтах следующих последними в потоке сетевых данных.
  728. /// </summary>
  729. //[Serializable]
  730. //class SendInfo
  731. //{
  732. // public string message;
  733. // public string filename;
  734. // public int filesize;
  735. //}
  736.  
  737. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement