/// <summary> /// 接收数据包 /// </summary> /// <returns>返回的数据包</returns> public byte[] ReceivePacket() { try { return(handler.ReceiveSealedPacket()); } catch (SocketException se) { isOpen = false; throw new SocketException(se.ErrorCode); } }
/// <summary> /// 连接函数 /// </summary> /// <param name="host">服务器地址</param> /// <param name="port">服务器端口</param> public void Connect(string host, int port) { this.host = host; this.port = port; if (isOpen) { throw new TransmissionException("已经连接了服务器!"); } try { Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(host, port); channelHandler = new PacketHandler(client); key = channelHandler.Key; iv = channelHandler.IV; byte[] handshakeMsg = HandshakeHandler.BuildHandshake(key, iv); channelHandler.SendNormalPacket(handshakeMsg); byte[] ackBytes = channelHandler.ReceiveSealedPacket(); if (HandshakeHandler.VerifyHandshake(ackBytes, key, iv)) { isOpen = true; } else { channelHandler.Close(); } } catch (SocketException se) { throw new TransmissionException(se.Message, se); } }
/// <summary> /// 接收数据 /// </summary> /// <returns>返回接收的数据</returns> public byte[] Receive() { if (isOpen) { return(channelHandler.ReceiveSealedPacket()); } throw new TransmissionException("还没有连接服务器!"); }
/// <summary> /// 读取封装传输包 /// </summary> /// <returns>返回读取的传输包</returns> public byte[] ReceiveSealedPacket() { byte[] result = handler.ReceiveSealedPacket(); foreach (PacketLogger logger in loggers) { logger.Write(result, EndPoint); } return(result); }
/// <summary> /// 交互函数 /// </summary> /// <param name="stateInfo"></param> internal void Exchange(object stateInfo) { try { isClose = false; do { byte[] rcvMsg = handler.ReceiveSealedPacket(); DictNode responseNode = HandlePacket(rcvMsg); byte[] sndMsg = BEncode.ByteArrayEncode(responseNode); handler.SendSealedPacket(sndMsg); if (isClose) { return; } } while (true); } catch (TdsException te) { Console.WriteLine("Tds Exception:{0}", te.Message); } catch (PacketException pe) { Console.WriteLine("Packet Exception:{0}", pe.Message); } catch (IOException ioe) { Console.WriteLine("IO Exception:{0}", ioe.Message); } catch (SocketException se) { Console.WriteLine("Socket Exception:{0}", se.Message); } catch (BEncodingException bee) { Console.WriteLine("BEncoding Exception:{0}", bee.Message); } finally { monitor.Unregister(handler); handler.Close(); } }
/// <summary> /// 连接函数 /// </summary> /// <param name="host">服务器地址</param> /// <param name="port">服务器端口</param> public void Connect(string host, int port) { if (isOpen) { throw new TransmissionException("已经连接了服务器!"); } try { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Any, clientPort); server.Bind(serverEndPoint); server.Listen(1); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(host, port); channelHandler1 = new PacketHandler(client); key = channelHandler1.Key; iv = channelHandler1.IV; byte[] openBytes = BuildHandshakeMessage(); channelHandler1.SendNormalPacket(openBytes); Socket socket = server.Accept(); channelHandler2 = new PacketHandler(socket); channelHandler2.SetKeyIV(key, iv); byte[] ackMsg = channelHandler2.ReceiveSealedPacket(); if (HandshakeHandler.VerifyHandshake(ackMsg, key, iv)) { isOpen = true; channelHandler1.SendSealedPacket(ackMsg); } else { channelHandler1.Close(); channelHandler2.Close(); } } catch (SocketException se) { throw new TransmissionException(se.Message, se); } }