/// <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"); } } } }
/// <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; } }
/// <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(); } } }