예제 #1
0
 /// <summary>
 /// 接收数据包
 /// </summary>
 /// <returns>返回的数据包</returns>
 public byte[] ReceivePacket()
 {
     try
     {
         return(handler.ReceiveSealedPacket());
     }
     catch (SocketException se)
     {
         isOpen = false;
         throw new SocketException(se.ErrorCode);
     }
 }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
 /// <summary>
 /// 接收数据
 /// </summary>
 /// <returns>返回接收的数据</returns>
 public byte[] Receive()
 {
     if (isOpen)
     {
         return(channelHandler.ReceiveSealedPacket());
     }
     throw new TransmissionException("还没有连接服务器!");
 }
예제 #4
0
 /// <summary>
 /// 读取封装传输包
 /// </summary>
 /// <returns>返回读取的传输包</returns>
 public byte[] ReceiveSealedPacket()
 {
     byte[] result = handler.ReceiveSealedPacket();
     foreach (PacketLogger logger in loggers)
     {
         logger.Write(result, EndPoint);
     }
     return(result);
 }
예제 #5
0
        /// <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();
            }
        }
예제 #6
0
        /// <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);
            }
        }