Beispiel #1
0
        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);
                    }
                }
            }
        }
Beispiel #2
0
        ///// <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);
        }
Beispiel #3
0
 protected virtual void OnDisconnected()
 {
     Disconnected?.BeginInvoke(this, Target, EndEventInvoke, Disconnected);
 }
Beispiel #4
0
        /// <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();
            }
        }
Beispiel #6
0
        /// <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();
            }
        }
Beispiel #7
0
        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;
            }
        }
Beispiel #8
0
        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 {}
        }