/// <summary> /// 消息处理方法 /// </summary> /// <param name="endPoint">远程网络终结点</param> /// <param name="Context">内容</param> private void MessagePack(EndPoint endPoint, string[] Context) { for (int ic = 0; ic < Context.Length; ic = ic + 1) // 遍历每一个包 { string[] Message = Context[ic].Split(' '); // 以空格分割为数组 Connet ThisConneter = null; if (None.ContainsKey(endPoint)) { ThisConneter = None[endPoint]; } if (Login.ContainsKey(endPoint)) { ThisConneter = Login[endPoint]; } if (Mmap.ContainsKey(endPoint)) { ThisConneter = Mmap[endPoint]; } if (Message[0] == "Login") // 鉴别为登录命令 { string User = Message[1]; string Pwd = Message[2]; if (SelectPassword(User) == Pwd && Pwd != "" && Pwd != null) // 验证用户名密码 { SendMessage(endPoint, "Login OK 200"); // 发送登录成功代码 Login.Add(endPoint, None[endPoint]); // 在字典添加 Login[endPoint].ConnetType = ConnetType.Login; // 设为登录状态 None.Remove(endPoint); // 从无状态字典内移除 } else { SendMessage(endPoint, "Login Error 400"); // 发送登录失败信息 ServerTcp.Close(endPoint); // 关闭连接 } } if (Message[0] == "Mmap") // 鉴别为请求映射命令 { // TCP,192.168.1.10,25565 if (ThisConneter.ConnetType != ConnetType.None) { string[] Mmap = Message[1].Split(','); // 分割数据 for (int i = 0; i < Mmap.Length; i = i + 1) { if (SelectMmap(ThisConneter.User, Mmap[1], Mmap[2])) // 遍历数据,检查权限 { // 创建新映射对象并且实例化 用户名 IP地址 端口 查询映射速度 用户名 ip 端口 Mmaper NewMmap = new Mmaper(ThisConneter.User, IPAddress.Parse(Mmap[1]), new Ports(int.Parse(Mmap[2])), SelectMmapSpeed(ThisConneter.User, Mmap[1], Mmap[2])); MmapDict.Add(NewMmap); // 添加到映射规则集合 // 创建映射对象并且实例化,映射规则 查询剩余流量 用户名 ip 端口 Mmaps mmaps = new Mmaps(NewMmap, SelectFlow(ThisConneter.User, Mmap[1], Mmap[2])); MmapsDict.Add(new IPEndPoint(NewMmap.LocalhostIP, NewMmap.LocalhostPort.Port), mmaps); // 添加到映射规则字典 mmaps.Messages += MmapMessager; // 绑定接收消息事件 mmaps.Conneter += MmapConneter; // 绑定收到连接事件 mmaps.FlowEnd += MmapFlowEnd; // 绑定流量耗尽事件 mmaps.TcpError += MmapTcpError; // 绑定Tcp连接终止事件 } else { SendMessage(endPoint, "Mmap Error " + Mmap[1] + ":" + Mmap[2] + "无映射权限");// 返回无权限信息 } } } else { SendMessage(endPoint, "Mmap Error 未登录"); // 返回无权限信息 } } if (Message[0] == "Select") // 鉴别为查询映射权限命令 { if (ThisConneter.ConnetType != ConnetType.None) { string Return = "MmapSelectReturn " + SelectMmapAll(ThisConneter.User); // 获取用户名下的所有映射规则 SendMessage(endPoint, Return); // 发送给客户端 } else { SendMessage(endPoint, "Select Error 未登录"); // 返回无权限信息 } } if (Message[0] == "MmapInfo") // 鉴别为映射数据传输 { //MmapInfo 180.1.1.5:6666->192.168.1.10:25565 XXXXXXXXXXXX(Base64) if (ThisConneter.ConnetType != ConnetType.None) { IPAddress ClientiPAddress = IPAddress.Parse(Message[1].Split("->")[0].Split(":")[0]); // 获取客户端IP Ports ClientPort = new Ports(int.Parse(Message[1].Split("->")[0].Split(":")[1])); // 获取客户端端口 IPAddress ServeriPAddress = IPAddress.Parse(Message[1].Split("->")[1].Split(":")[0]); // 获取服务器IP Ports ServerPort = new Ports(int.Parse(Message[1].Split("->")[1].Split(":")[1])); // 获取服务器端口 IPEndPoint ClientiPEndPoint = new IPEndPoint(ClientiPAddress, ClientPort.Port); // 创建客户端网络终结点 IPEndPoint ServeriPEndPoint = new IPEndPoint(ServeriPAddress, ServerPort.Port); // 创建服务器网络终结点 if (MmapsDict.ContainsKey(ServeriPEndPoint)) { MmapsDict[ServeriPEndPoint].Send(ClientiPEndPoint, Convert.FromBase64String(Message[2]));// 发送数据 } else { SendMessage(endPoint, "MmapInfo Error 未找到映射"); // 返回未找到映射 } } else { SendMessage(endPoint, "Select Error 未登录"); // 返回无权限信息 } } if (Message[0] == "TcpClose") // 鉴别为关闭连接 { //TcpClose 180.1.1.5:6666->192.168.1.10:25565 if (ThisConneter.ConnetType != ConnetType.None) { IPAddress ClientiPAddress = IPAddress.Parse(Message[1].Split("->")[0].Split(":")[0]); // 获取客户端IP Ports ClientPort = new Ports(int.Parse(Message[1].Split("->")[0].Split(":")[1])); // 获取客户端端口 IPAddress ServeriPAddress = IPAddress.Parse(Message[1].Split("->")[1].Split(":")[0]); // 获取服务器IP Ports ServerPort = new Ports(int.Parse(Message[1].Split("->")[1].Split(":")[1])); // 获取服务器端口 IPEndPoint ClientiPEndPoint = new IPEndPoint(ClientiPAddress, ClientPort.Port); // 创建客户端网络终结点 IPEndPoint ServeriPEndPoint = new IPEndPoint(ServeriPAddress, ServerPort.Port); // 创建服务器网络终结点 if (MmapsDict.ContainsKey(ServeriPEndPoint)) { MmapsDict[ServeriPEndPoint].Close(ClientiPEndPoint); // 关闭连接 } else { SendMessage(endPoint, "TcpClose Error 未找到映射"); // 返回未找到映射 } } else { SendMessage(endPoint, "Select Error 未登录"); // 返回无权限信息 } } if (Message[0] == "MmapStop") // 鉴别为停止映射 { //MmapStop 192.168.1.10:25565 if (ThisConneter.ConnetType != ConnetType.None) { IPAddress ServeriPAddress = IPAddress.Parse(Message[1].Split("->")[1].Split(":")[0]); // 获取服务器IP Ports ServerPort = new Ports(int.Parse(Message[1].Split("->")[1].Split(":")[1])); // 获取服务器端口 IPEndPoint ServeriPEndPoint = new IPEndPoint(ServeriPAddress, ServerPort.Port); // 创建服务器网络终结点 if (MmapsDict.ContainsKey(ServeriPEndPoint)) { Flow flow = MmapsDict[ServeriPEndPoint].Stop(); // 映射并且获取剩余流量 double MB = flow.MB; // 获取MB数值 if (flow.IsInfinity) { WriteSpend(ThisConneter.User, ServeriPAddress.ToString(), ServerPort.Port.ToString(), "∞"); } else { WriteSpend(ThisConneter.User, ServeriPAddress.ToString(), ServerPort.Port.ToString(), MB.ToString()); } } else { SendMessage(endPoint, "TcpClose Error 未找到映射"); // 返回未找到映射 } } else { SendMessage(endPoint, "Select Error 未登录"); // 返回无权限信息 } } } }
/// <summary> /// 收到连接 /// </summary> /// <param name="endPoint">远程终结点</param> private void Conneter(EndPoint endPoint) { Connet NewConnet = new Connet(IPAddress.Parse(endPoint.ToString().Split(':')[0]), new Ports(int.Parse(endPoint.ToString().Split(':')[1]))); // 实例化连接对象 NewConnet.TimeOut += ConnetTimeOut; // 绑定登录超时方法 }