private void ProcessDisconnect(SocketAsyncEventArgs e) { if (_isConnected) { _isConnected = false; ClientToken clientToken = (ClientToken)(e != null ? e.UserToken : _clientToken); clientToken.Close(); //Fire Disconnected event if (Disconnected != null) { if (CallDisconnectedAsync) { Disconnected.BeginInvoke(this, r => Disconnected.EndInvoke(r), null); } else { Disconnected(this); } } } }
///// <summary> ///// 更新并返回TcpClient的连接状态 ///// </summary> ///// <returns>假如处于连接状态,返回true,否则返回false</returns> //public bool IsSocketConnected() //{ // //return IsConnected_Socket = (BaseClient != null && BaseClient.IsSocketConnected()); // return IsConnected_Socket; //} /// <summary> /// 关闭UDP连接 /// </summary> /// <returns>假如关闭成功,返回1,否则返回0</returns> public int Close() { LastErrorMessage = string.Empty; int result = 1; try { if (BaseClient != null) { ThreadAbort(); //终止重连线程 //关闭流并释放资源 //NetStream.Close(); //NetStream.Dispose(); BaseClient.Close(); IsStartListening = false; ServerIp = null; ServerPort = 0; IsConnected = false; //IsConnected_Socket = false; //调用连接断开事件委托 if (Disconnected != null) { Disconnected.BeginInvoke(Name, new EventArgs(), null, null); } BaseClient.Close(); BaseClient = null; } } catch (Exception e) { LastErrorMessage = string.Format("关闭UDP连接{0}失败:{1}", Name, e.Message); FileClient.WriteExceptionInfo(e, LastErrorMessage, false); result = 0; throw; //假如不需要抛出异常,注释此行 } return(result); }
protected virtual void OnDisconnected() { Disconnected?.BeginInvoke(this, Target, EndEventInvoke, Disconnected); }
/// <summary> /// Метод асинхронно вызываемый при наличие данных в буферах приема. /// </summary> public void ReadCallback(IAsyncResult ar) { if (modeNetwork == Mode.indeterminately) { return; } TcpClientData myTcpClient = (TcpClientData)ar.AsyncState; try { NetworkStream ns = myTcpClient.tcpClient.GetStream(); int r = ns.EndRead(ar); if (r > 0) { // Из главного заголовка получим размер массива байтов информационного объекта string header = Encoding.Default.GetString(myTcpClient.buffer); int leninfo = int.Parse(header); // Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета MemoryStream ms = new MemoryStream(leninfo); byte[] temp = new byte[leninfo]; r = ns.Read(temp, 0, temp.Length); ms.Write(temp, 0, r); BinaryFormatter bf = new BinaryFormatter(); ms.Position = 0; SendInfo sc = (SendInfo)bf.Deserialize(ms); ms.Close(); if (sc.filesize > 0) { // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации FileStream fs = new FileStream(sc.filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize); do { temp = new byte[global.MAXBUFFER]; r = ns.Read(temp, 0, temp.Length); // Записываем строго столько байтов сколько прочтено методом Read() fs.Write(temp, 0, r); // Как только получены все байты файла, останавливаем цикл, // иначе он заблокируется в ожидании новых сетевых данных if (fs.Length == sc.filesize) { fs.Close(); fs = null; break; } }while (r > 0); temp = null; GC.Collect(); GC.WaitForPendingFinalizers(); } if (Receive != null) { Receive(this, new ReceiveEventArgs(sc)); } myTcpClient.buffer = new byte[global.LENGTHHEADER]; ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient); } else { DeleteClient(myTcpClient); // Событие клиент отключился if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился!", null, null); } } } catch (Exception e) { DeleteClient(myTcpClient); // Событие клиент отключился if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился аварийно!", null, null); } SoundError(); } }
/// <summary> /// Метод асинхронно вызываемый при наличие данных в буферах приема. /// </summary> public void ReadCallback(IAsyncResult ar) { if (ModeNetwork == Mode.Indeterminately) { return; } var myTcpClient = (TcpClientData)ar.AsyncState; try { var ns = myTcpClient.TcpClient.GetStream(); var r = ns.EndRead(ar); if (r > 0) { // Из главного заголовка получим размер массива байтов информационного объекта var sendinfolen = GetLengthByHeader(myTcpClient.Buffer); // Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета var ms = new MemoryStream(sendinfolen); var temp = new byte[sendinfolen]; r = ns.Read(temp, 0, temp.Length); ms.Write(temp, 0, r); var bf = new BinaryFormatter(); ms.Position = 0; var sc = (SendInfo)bf.Deserialize(ms); ms.Close(); if (sc.Filesize > 0) { var templength = sc.Filesize + sc.Padding; // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации if (DstDirectory.LastIndexOf("\\", StringComparison.Ordinal) + 1 != DstDirectory.Length) { DstDirectory += "\\"; } var fs = new FileStream(DstDirectory + sc.Filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.Filesize); //если файл шифрованный, то сначала проще собрать в памяти var tempms = new MemoryStream(); temp = new byte[Global.Maxbuffer]; do { while (templength > 0) { if (templength < temp.Length) { //считываем по длине файла r = ns.Read(temp, 0, templength); templength -= r; } else { //считываем по длине буффера r = ns.Read(temp, 0, temp.Length); templength -= r; } // Записываем строго столько байтов сколько прочтено методом Read() //fs.Write(temp, 0, r); tempms.Write(temp, 0, r); } // Как только получены все байты файла, останавливаем цикл, // иначе он заблокируется в ожидании новых сетевых данных if (tempms.Length != sc.Filesize + sc.Padding) { continue; } //теперь если файл шифрованный, то расшифруем его tempms.Seek(0, SeekOrigin.Begin); if (sc.IsFileCrypt) { var iv = new byte[16]; var cipherStream = (CryptoStream)_engine.DecryptStream(tempms, DiffieHellman.SecretKey, iv); using (var plainTextStream = new BinaryReader(cipherStream)) { var data = plainTextStream.ReadBytes(sc.Filesize); fs.Write(data, 0, sc.Filesize); } } else { //просто скопируем из памяти tempms.CopyTo(fs); } tempms.Close(); fs.Close(); break; } while (r > 0); GC.Collect(); GC.WaitForPendingFinalizers(); } if (Receive != null) { Receive.BeginInvoke(this, new ReceiveEventArgs(sc), null, null); } myTcpClient.Buffer = new byte[Global.Lengthheader]; ns.BeginRead(myTcpClient.Buffer, 0, myTcpClient.Buffer.Length, ReadCallback, myTcpClient); } else { DeleteClient(myTcpClient); // Событие клиент отключился if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился!", null, null); } } } catch (Exception) { DeleteClient(myTcpClient); // Событие клиент отключился if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился аварийно!", null, null); } SoundError(); } }
/// <summary> /// Метод асинхронно вызываемый при наличие данных в буферах приема. /// </summary> public void ReadCallback(IAsyncResult ar) { if (modeNetwork == Mode.indeterminately) { return; } TcpClientData myTcpClient = (TcpClientData)ar.AsyncState; try { NetworkStream ns = myTcpClient.tcpClient.GetStream(); int r = ns.EndRead(ar); if (r > 0) { string header = Encoding.Default.GetString(myTcpClient.buffer); int leninfo = int.Parse(header); MemoryStream ms = new MemoryStream(leninfo); byte[] temp = new byte[leninfo]; r = ns.Read(temp, 0, temp.Length); ms.Write(temp, 0, r); BinaryFormatter bf = new BinaryFormatter(); ms.Position = 0; SendInfo sc = (SendInfo)bf.Deserialize(ms); ms.Close(); if (sc.filesize > 0) { FileStream fs = new FileStream(sc.filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize); do { temp = new byte[Global.MAXBUFFER]; r = ns.Read(temp, 0, temp.Length); fs.Write(temp, 0, r); if (fs.Length == sc.filesize) { fs.Close(); fs = null; break; } }while (r > 0); temp = null; GC.Collect(); GC.WaitForPendingFinalizers(); } Receive?.Invoke(this, new ReceiveEventArgs(sc)); myTcpClient.buffer = new byte[Global.LENGTHHEADER]; ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient); } else { DeleteClient(myTcpClient); if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился!", null, null); } } } catch (Exception e) { DeleteClient(myTcpClient); // Событие клиент отключился if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился аварийно!", null, null); } SoundError(); } }
public void ReadCallback(IAsyncResult ar) { if (modeNetwork == Mode.indeterminately) { return; } try { NodeData node = (NodeData)ar.AsyncState; NetworkStream ns = node.newNode.GetStream(); int r = ns.EndRead(ar); if (r > 0) { string header = Encoding.Default.GetString(node.buffer); int leninfo = int.Parse(header); MemoryStream ms = new MemoryStream(leninfo); byte[] temp = new byte[leninfo]; r = ns.Read(temp, 0, temp.Length); ms.Write(temp, 0, r); XmlSerializer formatter = new XmlSerializer(typeof(MessageData)); ms.Position = 0; MessageData sc = (MessageData)formatter.Deserialize(ms); ms.Close(); if (sc.fileSize > 0) { if (sc.text == "nd_res") { sc.fileName += ".dd"; } FileStream fs = new FileStream(sc.fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.fileSize); do { if (sc.type == MessageData.TypeData.CODE) { Global.nameOfBasicFiles[0] = sc.fileName; } else { Global.nameOfBasicFiles[1] = sc.fileName; } temp = new byte[ConstField.BUFFER]; r = ns.Read(temp, 0, temp.Length); fs.Write(temp, 0, r); if (fs.Length == sc.fileSize) { fs.Close(); fs = null; break; } }while (r > 0); node.isBusy = false; temp = null; GC.Collect(); GC.WaitForPendingFinalizers(); } else { if (sc.text[0] == 'i') { string[] bufArr = sc.text.Split(','); NewNode.BeginInvoke(bufArr[1], Convert.ToInt32(bufArr[2]), null, null); ///NEW } else if (sc.text[0] == 'd') { string[] bufArr = sc.text.Split(','); DeleteNodeItem.BeginInvoke(Convert.ToInt32(bufArr[1]), null, null); } else if (sc.text == "client") { _client = Global.nodes.Last(); _client.typeNode = NodeData.TypeNode.CLIENT; Global.nodes.Remove(Global.nodes.Last()); } else if (sc.text[0] == 'n') { string[] bufArr = sc.text.Split(','); bufNodes = Convert.ToInt32(bufArr[1]); All.BeginInvoke(Convert.ToInt32(bufArr[1]), null, null); } } if (Receive != null) { Receive(this, new ReceiveEventArgs(sc)); } node.buffer = new byte[ConstField.LENGTHHEADER]; ns.BeginRead(node.buffer, 0, node.buffer.Length, new AsyncCallback(ReadCallback), node); if (sc.text == "nd_res") { var dirInfo = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dd"); if (dirInfo.Length == bufNodes) { GetFinalResult.BeginInvoke(null, null); } } if (modeNetwork == Mode.Client) { count--; if (count <= 0) { All.BeginInvoke(this, null, null); Global.count++; } } } else { string buf = node.identification.ToString(); DeleteNode(node); SendData($"d,{bufID}"); if (Disconnected != null) { Disconnected.BeginInvoke(this, "Узел отключился!", bufID.ToString(), null, null); } } } catch (Exception e) { if (Disconnected != null) { Disconnected.BeginInvoke(this, "Узел отключился аварийно!", "", null, null); } globalState = "ReadCallback | " + e; } }
public void HandleConnection(object unused) { Thread.Sleep(10); LingerOption lingerOption = new LingerOption(true, 10); connection.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lingerOption); try { connection.Connect(ep); } catch {} int ret; decimal dTimeOut = DateTime.Now.ToFileTime(); string aData = ""; string bData = ""; byte[] RecvBytes; if (connection.Connected) { Connected.BeginInvoke(null, null, null, null); } while (connection.Connected && !disconnect) { if (connection.Available > 0) { RecvBytes = new byte[connection.Available]; ret = connection.Receive(RecvBytes, 0, RecvBytes.Length, SocketFlags.None); aData = aData + Encoding.ASCII.GetString(RecvBytes).Substring(0, ret); while (aData.IndexOf(newline) > -1) { bData = Regex.Split(aData, newline)[0].ToString(); HandleData(bData); aData = aData.Substring((aData.IndexOf(newline) + 2)); } dTimeOut = DateTime.Now.ToFileTime(); } else { /* * myData.bStayConnected = ((dTimeOut + 9000000000 /* 30 minutes )/* < DateTime.Now.ToFileTime() ? false : true); * /*if (!myData.bStayConnected) * { * Send("451 Timeout" + newline); * } */ Thread.Sleep(1); } } //mySocket.Shutdown(SocketShutdown.Both); connection.Close(); try { Disconnected.BeginInvoke(null, null, null, null); } catch {} }