/// <summary>
 /// 发送数据(握手)
 /// </summary>
 /// <param name="state">发送对像</param>
 public static void SendHandshake(Kernel.StateObject state)
 {
     using (MemoryStream ms = new MemoryStream())
     {
         using (BinaryWriter bw = new BinaryWriter(ms))
         {
             byte  ver           = 1;
             short cmd1          = CommCmd.Handshake;
             short cmd2          = ErrCommon.Success; //0;
             int   packagelength = 0;
             bw.Write(ver);
             bw.Write(cmd1);
             bw.Write(cmd2);
             bw.Write(packagelength);
             bw.Flush();
             if (state.workSocket.Connected)
             {
                 state.Send(ms.ToArray());
                 if (cmd1 != CommCmd.Handshake)
                 {
                     Commonality.ConsoleManage.Write(Commonality.ErrorLevel.Response, "SendDatas", "CMD=" + cmd1.ToString() + " " + "BACKCODE=" + cmd2.ToString() + ">>IPaddress:" + state.wanIP.ToString() + ">>Port:" + state.wanPort.ToString());
                 }
             }
             else
             {
                 Commonality.ConsoleManage.Write(Commonality.ErrorLevel.Response, "SendDatas", "state.workSocket is not Connected");
             }
         }
     }
 }
Exemple #2
0
 /// <summary>
 /// 移除客户端连接列表
 /// </summary>
 /// <param name="Request">连接对像</param>
 public static void RemoveClientConnList(Kernel.StateObject Request)
 {
     try
     {
         foreach (KeyValuePair <string, Kernel.StateObject> a in ClientConnList)
         {
             if (a.Value != null)
             {
                 if (a.Value.ConnectionSession == Request.ConnectionSession)
                 {
                     ClientConnList.Remove(a.Key);
                     break;
                 }
             }
         }
         Commonality.ConsoleManage.Write(Commonality.ErrorLevel.Serious,
                                         "KOIPMonitor>>CommClass>>RevDevObjList>>", "User is Down!~~");
     }
     catch (Exception ex)
     {
         Commonality.ConsoleManage.Write(Commonality.ErrorLevel.Serious,
                                         "KOIPMonitor>>CommClass>>RemoveClientConnList>>",
                                         ex.Message);
         return;
     }
 }
Exemple #3
0
 /// <summary>
 /// 添加客户端用户列表
 /// </summary>
 /// <param name="UserId">用户ID</param>
 /// <param name="Request">连接对像</param>
 public static void AddClientConnList(string UserId, Kernel.StateObject Request)
 {
     try
     {
         if (!ClientConnList.ContainsKey(UserId))
         {
             ClientConnList.Add(UserId, Request);
         }
     }
     catch (Exception ex)
     {
         Commonality.ConsoleManage.Write(Commonality.ErrorLevel.Serious,
                                         "KOIPMonitor>>CommClass>>AddClientConnList>>",
                                         ex.Message);
         return;
     }
 }
 private void GoToProcess(StateObject state)
 {
     this.ReceiveEvent(state);
 }
        public void ReadCallback(IAsyncResult ar)
        {
            StateObject state       = null;
            bool        closeSocket = false;

            try
            {
                state = (StateObject)ar.AsyncState;
                Socket userClient = state.workSocket;
                int    bytesRead  = 0;

                //...判斷socket連線是否斷掉
                if (userClient == null || !userClient.Connected)
                {
                    closeSocket = true;
                    return;
                }

                bytesRead = userClient.EndReceive(ar);



                if (bytesRead > 0)
                {
                    #region//...是否讀過 Header
                    if (!state.isReadHeader)
                    {
                        //...建立接收封包的存放位置
                        string directoryName = "/" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Remove(0, 6) + "/Process/";

                        if (OSType != 0)
                        {
                            directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Remove(0, 6) + "\\Process\\";
                        }
                        DirectoryInfo Createdir = new DirectoryInfo(directoryName);
                        if (!Createdir.Exists)
                        {
                            Createdir.Create();
                        }
                        //state.receiveFileTemporarily = directoryName + RandomSession.createSession(64);
                        state.receiveFileTemporarily = directoryName + "serv_" + Guid.NewGuid().ToString();

                        byte[] HeadReceiveBuffer = new byte[bytesRead];
                        Array.Copy(state.receiveBuffer, HeadReceiveBuffer, bytesRead);
                        state.ListHeadBuffer.AddRange(HeadReceiveBuffer);
                        state.headerBufferSize = state.headerBufferSize - bytesRead;

                        if (state.headerBufferSize == 0)
                        {
                            byte[] TempHeadReceiveBuffer = state.ListHeadBuffer.ToArray();
                            state.ListHeadBuffer.Clear();
                            state.headerBufferSize = 9;
                            using (MemoryStream ms_readheader = new MemoryStream(TempHeadReceiveBuffer, 0, TempHeadReceiveBuffer.Length))
                            {
                                BinaryReader br = new BinaryReader(ms_readheader);
                                state.ver  = br.ReadByte();                     //...封包版本號
                                state.cmd1 = br.ReadInt16();                    //...命令1
                                state.cmd2 = br.ReadInt16();                    //...命令2
                                state.receivePackageTotalSize = br.ReadInt32(); //...封包內容總長度
                            }

                            if (state.receivePackageTotalSize <= 0)
                            {
                                //...沒有夾帶內容
                                state.isReadHeader  = false;                            //...讀取完畢將標記改為false
                                state.receiveBuffer = new byte[state.headerBufferSize]; //...Buffer 清空
                                GoToProcess(state);                                     //...接收完畢號 處理事件
                            }
                            else
                            {
                                //...當有夾帶內容時
                                state.receiveBuffer = null;
                                state.receiveBuffer = new byte[state.receivePackageTotalSize]; //... 080609 by randy
                                state.isReadHeader  = true;                                    //,,,將標記設定為讀過標頭,可以繼續接收資料
                            }
                        }
                        else if (state.headerBufferSize > 0)
                        {
                            //...繼續接收
                            state.receiveBuffer = new byte[state.headerBufferSize];//--randy,2008.06.09
                        }
                        //...接收buffer的資料
                        if (userClient == null || !userClient.Connected)
                        {
                            closeSocket = true;
                            return;
                        }
                        if (userClient.Connected)
                        {
                            userClient.BeginReceive(state.receiveBuffer, 0, state.receiveBuffer.Length, 0, new AsyncCallback(ReadCallback), state);
                            return;
                        }
                        else
                        {
                            closeSocket = true;
                            return;
                        }
                    }
                    #endregion

                    #region //...儲存數據


                    DiskIO.Save(state.receiveFileTemporarily, state.receiveBuffer, bytesRead);


                    state.receivePackageTotalSize = state.receivePackageTotalSize - bytesRead;//--randy,2008.06.09
                    if (state.receivePackageTotalSize == 0)
                    {
                        //...接收完畢
                        state.isReadHeader  = false;                            //...讀取Header reset
                        state.receiveBuffer = new byte[state.headerBufferSize]; //...recevice buffer reset
                        GoToProcess(state);                                     //...接收完畢號 處理事件
                    }
                    else if (state.receivePackageTotalSize > 0)
                    {
                        //...繼續接收
                        state.receiveBuffer = new byte[state.receivePackageTotalSize];//--randy,2008.06.09
                    }
                    #endregion

                    #region//...接收buffer的資料
                    //...接收buffer的資料
                    if (userClient == null || !userClient.Connected)
                    {
                        closeSocket = true;
                        return;
                    }
                    userClient.BeginReceive(state.receiveBuffer, 0, state.receiveBuffer.Length, 0, new AsyncCallback(ReadCallback), state);

                    #endregion
                }
                else
                {
                    //KConsole.Write(ErrorLevel.Response, "", "Kernel>>AsynTCPSocket>>ReadCallback>>Exception: 接收到的數據長度<=0");
                    //KConsole.Write(ErrorLevel.Warn, "Kernel>>AsynTCPSocket>>ReadCallback>>", "接收到的數據長度<=0");
                    KConsole.Write(ErrorLevel.Response, "", "bytesRead=" + bytesRead.ToString());
                    closeSocket = true;
                }
            }
            catch (Exception ex)
            {
                //KConsole.Write(ErrorLevel.Serious, "Kernel>>AsynTCPSocket>>ReadCallback>>", ex.Message);
                KConsole.Write(ErrorLevel.Response, "", "Kernel>>AsynTCPSocket>>ReadCallback>>Exception:" + ex.Message);
                closeSocket = true;
            }
            finally
            {
                if (closeSocket)
                {
                    if (ExceptionHandlingEvent != null)
                    {
                        ExceptionHandlingEvent(state);
                    }
                    state = null;
                    //GC.Collect();
                }
            }
        }