Esempio n. 1
0
        /// <summary>
        /// 建立连接
        /// </summary>
        /// <param name="dns">对方的IP End Point</param>
        /// <param name="id">对方节点的ID号</param>
        public void StartConnect(IPEndPoint dns, byte[] id)
        {
            //如果本地连接数大于最大连接数,则返回
            if (connections.Count >= maxInitiate)
            {
                return;
            }

            //如果ID号相同,则表明是本地发送的网络信息,则返回
            if (Globals.IsArrayEqual(id, myID, 20))
            {
                return;
            }

            //如果该ID号已经存在,则返回
            foreach (IEncryptedConnection item in connections.Values)
            {
                if (Globals.IsArrayEqual(id, item.ID, 20))
                {
                    return;
                }
            }

            //开始建立连接
            try
            {
                ISingleSocket singleSocket = rawServer.StartConnect(dns, null);
                connections[singleSocket] = new EncryptedConnection(this, singleSocket, id);
            }

            catch
            {
                return;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 写入数据
        /// </summary>
        /// <param name="singleSocket">待写入的单套接字</param>
        public void FlushConnection(ISingleSocket singleSocket)
        {
            IEncryptedConnection encryptedConnection = connections[singleSocket];

            if (encryptedConnection.Completed)
            {
                connecter.FlushConnection(encryptedConnection);
            }
        }
Esempio n. 3
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="encrypter">封装连接类</param>
 /// <param name="connection">单套接字</param>
 /// <param name="id">对方下载工具的ID号</param>
 public EncryptedConnection(IEncrypter encrypter, ISingleSocket connection, byte[] id)
 {
     this.encrypter          = encrypter;
     this.connection         = connection;
     this.id                 = id;
     this.isLocallyInitiated = (id != null);
     this.completed          = false;
     this.closed             = false;
     this.buffer             = new MemoryStream();
     BuildReadFunctionChain();
     SendHandshakeMessage();
 }
Esempio n. 4
0
        /// <summary>
        /// 关闭单套接字
        /// </summary>
        /// <param name="singleSocket">待关闭的单套接字</param>
        private void CloseSocket(ISingleSocket singleSocket)
        {
            //在poll注销Socket
            poll.Unregister(singleSocket.Socket);

            //在字典中移除singleSocket
            singleSocketDictionary.Remove(singleSocket.Socket.Handle);

            //关闭套接字
            singleSocket.Socket.Close();
            singleSocket.Socket = null;

            //关闭singleSocket的连接
            singleSocket.Handler.CloseConnection(singleSocket);
        }
Esempio n. 5
0
        /// <summary>
        /// 处理客户端套接字
        /// </summary>
        /// <param name="item">待处理的PollItem</param>
        private void HandleClientSocket(PollItem item)
        {
            if (!singleSocketDictionary.ContainsKey(item.Socket.Handle))
            {
                return;
            }

            ISingleSocket singleSocket = singleSocketDictionary[item.Socket.Handle];

            singleSocket.IsConnected = true;

            //如果出错或者挂起,则关闭连接
            if ((item.Mode & (PollMode.PollError | PollMode.PollHangUp)) != 0)
            {
                this.CloseSocket(singleSocket);
                return;
            }

            //如果有数据可读,则读数据
            if ((item.Mode & PollMode.PollIn) != 0)
            {
                try
                {
                    singleSocket.LastHit = DateTime.Now;
                    int available = singleSocket.Socket.Available;

                    if (available == 0)
                    {
                        this.CloseSocket(singleSocket);
                    }

                    else
                    {
                        //把数据读到一个缓冲区
                        byte[] data = new byte[available];
                        singleSocket.Socket.Receive(data, 0, SocketFlags.None);

                        //调用封装连接管理类的DataCameIn进行处理
                        singleSocket.Handler.DataCameIn(singleSocket, data);
                    }
                }

                catch (SocketException socketEx)
                {
                    if (socketEx.ErrorCode != 10035) //WSAE WOULD BLOCK
                    {
                        this.CloseSocket(singleSocket);
                        return;
                    }
                }
            }

            //如果有数据可写,则写数据
            if (((item.Mode & PollMode.PollOut) != 0) && (singleSocket.Socket != null) && (!singleSocket.IsFlushed))
            {
                singleSocket.TryWrite();

                //最后检查是否数据都已经真的发出去了(IsFlushed),如果是,
                //则调用封装连接管理类中提供的FlushConnection函数进行处理。
                if (singleSocket.IsFlushed)
                {
                    singleSocket.Handler.FlushConnection(singleSocket);
                }
            }
        }
Esempio n. 6
0
 /// <summary>
 /// 增加死连接
 /// </summary>
 /// <param name="item"></param>
 public void AddToDeadFromWrite(ISingleSocket item)
 {
     deadFromWrite.Add(item);
 }
Esempio n. 7
0
 public void Remove(ISingleSocket keySocket)
 {
     throw new Exception("The method or operation is not implemented.");
 }
Esempio n. 8
0
 public void MakeExternalConnection(ISingleSocket singleSocket)
 {
     externalDummySockets.Add(singleSocket);
 }
Esempio n. 9
0
 public void FlushConnection(ISingleSocket singleSocket)
 {
 }
Esempio n. 10
0
 public void DataCameIn(ISingleSocket singleSocket, byte[] data)
 {
     dataIn.Add(new object[] { singleSocket, data });
 }
Esempio n. 11
0
        public void Test1()
        {
            Flag fa = new Flag();
            Flag fb = new Flag();

            try
            {
                DummyEncrypter da = new DummyEncrypter();
                IRawServer     sa = new RawServer(fa, 100, 100, false);
                TestHelper     ta = new TestHelper();
                ta.Loop(sa);
                ta.sl(sa, da, 6800);

                DummyEncrypter db = new DummyEncrypter();
                IRawServer     sb = new RawServer(fb, 100, 100, false);
                TestHelper     tb = new TestHelper();
                tb.Loop(sb);
                tb.sl(sb, db, 6801);

                Thread.Sleep(50);
                ISingleSocket ca = sa.StartConnect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6801), null);
                Thread.Sleep(50);

                Assert.AreEqual(0, da.externalDummySockets.Count);
                Assert.AreEqual(0, da.dataIn.Count);
                Assert.AreEqual(0, da.lostDummySockets.Count);
                Assert.AreEqual(1, db.externalDummySockets.Count);

                ISingleSocket cb = db.externalDummySockets[0];
                db.externalDummySockets.Clear();

                Assert.AreEqual(0, db.dataIn.Count);
                Assert.AreEqual(0, db.lostDummySockets.Count);

                ca.Write(new byte[] { (byte)'a', (byte)'a', (byte)'a' });
                cb.Write(new byte[] { (byte)'b', (byte)'b', (byte)'b' });
                Thread.Sleep(50);

                Assert.AreEqual(0, da.externalDummySockets.Count);
                //da.data_in = ca, 'bbb'
                da.dataIn.Clear();
                Assert.AreEqual(0, da.lostDummySockets.Count);
                Assert.AreEqual(0, db.externalDummySockets.Count);
                //db.data_in = cb, 'aaa'
                db.dataIn.Clear();
                Assert.AreEqual(0, db.lostDummySockets.Count);

                ca.Write(new byte[] { (byte)'c', (byte)'c', (byte)'c' });
                cb.Write(new byte[] { (byte)'d', (byte)'d', (byte)'d' });
                Thread.Sleep(50);

                Assert.AreEqual(0, da.externalDummySockets.Count);
                //da.data_in = ca, 'ddd'
                da.dataIn.Clear();
                Assert.AreEqual(0, da.lostDummySockets.Count);
                Assert.AreEqual(0, db.externalDummySockets.Count);
                //db.data_in = cb, 'ccc'
                db.dataIn.Clear();
                Assert.AreEqual(0, db.lostDummySockets.Count);

                ca.Close();
                Thread.Sleep(50);

                Assert.AreEqual(0, da.externalDummySockets.Count);
                Assert.AreEqual(0, da.dataIn.Count);
                Assert.AreEqual(0, da.lostDummySockets.Count);
                Assert.AreEqual(0, db.externalDummySockets.Count);
                Assert.AreEqual(0, db.dataIn.Count);
                Assert.AreEqual(1, db.lostDummySockets.Count);
                db.lostDummySockets.Clear();
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            finally
            {
                fa.Set();
                fb.Set();
            }
        }
Esempio n. 12
0
 public void LoseConnection(ISingleSocket singleSocket)
 {
     lostDummySockets.Add(singleSocket);
 }
Esempio n. 13
0
 /// <summary>
 /// 接受数据
 /// </summary>
 /// <param name="singleSocket">接受的单套接字</param>
 /// <param name="data">接受的数据</param>
 public void DataCameIn(ISingleSocket singleSocket, byte[] data)
 {
     connections[singleSocket].DataCameIn(data);
 }
Esempio n. 14
0
 /// <summary>
 /// 关闭连接
 /// </summary>
 /// <param name="singleSocket">待关闭的单套接字</param>
 public void CloseConnection(ISingleSocket singleSocket)
 {
     connections[singleSocket].Server();
 }
Esempio n. 15
0
 /// <summary>
 /// 增加连接
 /// </summary>
 /// <param name="singleSocket">待建立的单套接字</param>
 public void MakeExternalConnection(ISingleSocket singleSocket)
 {
     connections[singleSocket] = new EncryptedConnection(this, singleSocket, null);
 }
Esempio n. 16
0
 /// <summary>
 /// 移除连接
 /// </summary>
 /// <param name="keySocket">待移除的单套接字</param>
 public void Remove(ISingleSocket keySocket)
 {
     this.connections.Remove(keySocket);
 }
Esempio n. 17
0
 public void CloseConnection(ISingleSocket singleSocket)
 {
     throw new Exception("The method or operation is not implemented.");
 }
Esempio n. 18
0
 public void AddToDeadFromWrite(ISingleSocket item)
 {
     throw new Exception("The method or operation is not implemented.");
 }