Exemplo n.º 1
0
        public void Init()
        {
            efifo_rcv.Init(TCP_MAX_DEPTH_NUM);
            for (int i = 0; i < TCP_MAX_DEPTH_NUM; i++)
            {
                tyNode         nnode = new tyNode(TCP_MAX_DATA_LEN);
                PNode <tyNode> pnode = new PNode <tyNode>();

                nnode.pnode = pnode;
                epool_rcv.Add(pnode, nnode);
            }
        }
Exemplo n.º 2
0
        public byte[] GetRcvBuffer(ref int _recv_length)
        {
            if (efifo_rcv.GetValidNum() == 0)
            {
                _recv_length = 0;
                return(null);
            }
            else
            {
                tyNode nnode = efifo_rcv.Output();

                byte[] _recv_buffer = nnode.buffer;
                _recv_length = nnode.length;

                epool_rcv.Put(nnode.pnode);

                return(_recv_buffer);
            }
        }
Exemplo n.º 3
0
        public void ThreadEntry_ServerRcv()                                 //线程入口
        {
            Enter_MessageQueue(is_server, false, "ThreadEntry_ServerRcv run");

            while (true)
            {
                while (true)
                {
                    IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(str_ip), port); //本地端地址
                    Listener = new TcpListener(localEP);                                //建立监听类,并绑定到指定的端地址

                    try
                    {
                        Listener.Start();                                               //开始监听
                    }
                    catch (Exception ex)
                    {
                        Listener.Stop();
                        Listener = null;

                        Enter_MessageQueue(is_server, false, "Error local IP:" + localEP.ToString() + "setup. " + ex.Message);

                        Thread.Sleep(500);
                        continue;
                    }

                    Enter_MessageQueue(is_server, false, "IP setup ok!");

                    DateTime listener_pending_mark;
                    DateTime listener_pending_timeout;

                    listener_pending_mark = DateTime.Now;

                    while (true)
                    {
                        if (Listener.Pending() == false)
                        {
                            //为了避免每次都被tcpListener.AcceptTcpClient()阻塞线程,添加了此判断,
                            //no connection requests have arrived
                            //当没有连接请求时,什么也不做,有了请求再执行到tcpListener.AcceptTcpClient()

                            listener_pending_timeout = DateTime.Now;
                            TimeSpan ts          = listener_pending_timeout - listener_pending_mark;
                            int      second_pass = ts.Minutes * 60 + ts.Seconds;
                            if (second_pass >= 5)
                            {
                                Listener.Stop();
                                Listener = null;

                                Enter_MessageQueue(is_server, false, "Can't find any client");

                                Thread.Sleep(500);

                                break;
                            }
                        }
                        else
                        {
                            remoteClient = Listener.AcceptTcpClient();      //等待连接(阻塞)

                            network_stream_server      = remoteClient.GetStream();
                            br_server_read_from_client = new BinaryReader(network_stream_server);
                            bw_server_write_to_client  = new BinaryWriter(network_stream_server);

                            is_active = true;

                            break;
                        }
                    }

                    if (is_active == true)
                    {
                        break;
                    }
                }

                Enter_MessageQueue(is_server, false, "Tcp is active!");

                while (true) //循坏 接收/发送 数据
                {
                    /********************接收数据部分 Start******************/
                    int rcv_length;

                    PNode <tyNode> pnode = epool_rcv.Get();
                    tyNode         nnode = pnode.obj;

                    try
                    {
                        //接收客户端发送的数据
                        rcv_length = br_server_read_from_client.Read(nnode.buffer, 0, TCP_MAX_DATA_LEN);
                    }
                    catch (Exception ex)
                    {
                        Enter_MessageQueue(is_server, false, "Client lost, Read fail!" + ex.Message);
                        is_active = false;
                        break;
                    }

#if SUPPORT_SHOW_LEN
                    Dbg.WriteLine("Servre rcv:{0}", rcv_length);
#endif

#if SUPPORT_SHOW_DATA
                    Func.DumpBuffer(efifo_rcv.Peek(), rcv_length);
#endif

                    if (rcv_length == 0)
                    {
                        epool_rcv.Put(pnode);
                        Enter_MessageQueue(is_server, false, "Client lost, Read error!");
                        is_active = false;
                        break;
                    }
                    else
                    {
                        nnode.length = rcv_length;
                        efifo_rcv.Input(nnode);
                    }
                    /********************接收数据部分 End********************/
                }
            }

            //TcpMessage(is_server, false, "ThreadEntry_ServerRcv end");
        }
Exemplo n.º 4
0
        public void ThreadEntry_ClientRcv()
        {
            Enter_MessageQueue(is_server, false, "ThreadEntry_ClientRcv run");

            while (true)
            {
                IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(str_ip), port);    //远程服务器端地址;
                remoteServer = new TcpClient();

                try
                {
                    remoteServer.Connect(remoteEP);                         //调用connect方法连接远端服务器;
                }
                catch (Exception ex)
                {
                    remoteServer.Close();
                    remoteServer = null;

                    Enter_MessageQueue(is_server, false, "Can't connect to server:" + str_ip + ", " + ex.Message);
                    Thread.Sleep(500);
                    continue;
                }

                is_active = true;

                network_stream_client      = remoteServer.GetStream();
                bw_client_read_from_server = new BinaryReader(network_stream_client);
                bw_client_write_to_server  = new BinaryWriter(network_stream_client);

                Enter_MessageQueue(is_server, false, "Connect to server successfully:" + str_ip);
                Dbg.WriteLine("I'm using {0}.", remoteServer.Client.LocalEndPoint); //打印自己使用的端地址

                while (true)
                {
                    /********************接收数据部分 Start******************/
                    int rcv_length;

                    PNode <tyNode> pnode = epool_rcv.Get();

                    tyNode nnode = pnode.obj;

                    try
                    {
                        //接受服务器发送过来的消息,注意Client已经把数据处理成字符串了!
                        rcv_length = bw_client_read_from_server.Read(nnode.buffer, 0, TCP_MAX_DATA_LEN);
                    }
                    catch (Exception ex)
                    {
                        epool_rcv.Put(pnode);
                        Enter_MessageQueue(is_server, false, "Server lost, Read fail!" + ex.Message);
                        is_active = false;
                        break;
                    }

#if SUPPORT_SHOW_LEN
                    Dbg.WriteLine("Client rcv:{0}", rcv_length);
#endif

#if SUPPORT_SHOW_DATA
                    Func.DumpBuffer(efifo_rcv.Peek(), rcv_length);
#endif
                    if (rcv_length == 0)
                    {
                        epool_rcv.Put(pnode);
                        Enter_MessageQueue(is_server, false, "Server lost, Read error!");
                        is_active = false;
                        break;
                    }
                    else
                    {
                        nnode.length = rcv_length;
                        efifo_rcv.Input(nnode);
                    }
                    /********************接收数据部分 End********************/
                }
            }

            //TcpMessage(is_server, false, "ThreadEntry_ClientRcv end");
        }