public void StartServer() { if (modeNetwork == Mode.indeterminately) { try { _listener = new TcpListener(IPAddress.Any, 15000); _listener.Start(); _listener.BeginAcceptTcpClient(AcceptCallback, _listener); modeNetwork = Mode.Host; string host = Dns.GetHostName(); IPAddress ip = Dns.GetHostByName(host).AddressList[0].MapToIPv4(); globalState = $"Хост запущен. IP-адрес сервера: {ip.ToString()}"; SendText.BeginInvoke(globalState, null, null); } catch (Exception e) { _listener = null; globalState = e.Message; SendText.BeginInvoke(globalState, null, null); } } else { globalState = "Хост уже запущен"; } }
public void ConnectClient(string ipserver, string mode) { if (modeNetwork == Mode.indeterminately) { _node = new NodeData(); _node.newNode.BeginConnect(IPAddress.Parse(ipserver), 15000, new AsyncCallback(ConnectCallback), _node); if (mode == "node") { modeNetwork = Mode.Node; _node.typeNode = NodeData.TypeNode.NODE; } else { modeNetwork = Mode.Client; _node.typeNode = NodeData.TypeNode.CLIENT; } SendText.BeginInvoke("Попытка подключения...", null, null); } else { globalState = "Ошибка при подключении"; SendText.BeginInvoke(globalState, null, null); } }
public void SendData() { MessageData si = new MessageData(); if (modeNetwork == Mode.Node) { si.text = "nd_res"; } if (String.IsNullOrEmpty(si.text) == true && String.IsNullOrEmpty(SendFileName) == true) { return; } if (SendFileName != null) { FileInfo fi = new FileInfo(SendFileName); if (fi.Exists == true) { si.fileSize = (int)fi.Length; si.fileName = fi.Name; if (modeNetwork == Mode.Host || modeNetwork == Mode.Client) { if (fi.Extension == ".xml") { si.type = MessageData.TypeData.DATA; } if (fi.Extension == ".exe") { si.type = MessageData.TypeData.CODE; } } } fi = null; } MemoryStream ms = new MemoryStream(); XmlSerializer formatter = new XmlSerializer(typeof(MessageData)); formatter.Serialize(ms, si); ms.Position = 0; byte[] infobuffer = new byte[ms.Length]; int r = ms.Read(infobuffer, 0, infobuffer.Length); ms.Close(); byte[] header = GetHeader(infobuffer.Length); byte[] total = new byte[header.Length + infobuffer.Length + si.fileSize]; Buffer.BlockCopy(header, 0, total, 0, header.Length); Buffer.BlockCopy(infobuffer, 0, total, header.Length, infobuffer.Length); if (si.fileSize > 0) { FileStream fs = new FileStream(SendFileName, FileMode.Open, FileAccess.Read); fs.Read(total, header.Length + infobuffer.Length, si.fileSize); fs.Close(); fs = null; } NetworkStream ns = _node.newNode.GetStream(); if (modeNetwork == Mode.Host) { if (isFinal) { ns = _client.newNode.GetStream(); } else { if (Global.nodes[count].countFiles != 2) { ns = Global.nodes[count].newNode.GetStream(); Global.nodes[count].countFiles++; } else { count++; ns = Global.nodes[count].newNode.GetStream(); Global.nodes[count].countFiles++; } } } ns.Write(total, 0, total.Length); if (modeNetwork == Mode.Host) { if (Global.nodes.IndexOf(Global.nodes.Find(x => x.countFiles == 2)) != -1) { Global.nodes[Global.nodes.IndexOf(Global.nodes.Find(x => x.countFiles == 2))].isBusy = true; } } header = null; infobuffer = null; total = null; SendFileName = null; GC.Collect(); GC.WaitForPendingFinalizers(); SendText.BeginInvoke("Данные отправлены", null, null); Global.flag = false; }