예제 #1
0
 /// <summary>
 /// 开始服务
 /// </summary>
 public void Start()
 {
     if (udpServer == null)
     {
         udpServer = new SockUDP();
         udpServer.IsAsync = true;
         udpServer.DataArrival += new SockUDP.UDPEventHandler(udpServer_DataArrival);
         udpServer.Listen(port);
     }
 }
예제 #2
0
        /// <summary>
        /// 开始
        /// </summary>
        /// <param name="AllowResume">是否断点续传文件</param>
        public void Start(bool AllowResume)
        {
            System.IO.DirectoryInfo dInfo = new System.IO.DirectoryInfo(System.Windows.Forms.Application.StartupPath + "\\FileCache");
            if (!dInfo.Exists)
                dInfo.Create();
            CacheFile = System.Windows.Forms.Application.StartupPath + "\\FileCache\\" + TFileInfo.MD5;

            if (AllowResume)//如果断点续传
            {
                FileInfo finfo = new FileInfo(CacheFile);
                if (finfo.Exists)//如果缓存文件存在,则触发可断点续传事件
                    currGetPos = finfo.Length;//设置断点续传接收文件位置
            }
            else
            {
                File.Delete(CacheFile);//删除缓存文件
                System.Threading.Thread.Sleep(100);
            }


            if (sockUDP != null) return;//如果已经初始化套接字 ,则退出

            if (sockUDP == null)
            {
                sockUDP = new SockUDP();
                sockUDP.IsAsync = true;//异步通信
                sockUDP.DataArrival += new SockUDP.UDPEventHandler(sockUDP_DataArrival);
                sockUDP.Listen(0);//随机侦听
            }

            IPEndPoint myLocalEP = null;
            System.Net.IPAddress[] ips = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());//获得本机局域网IPV4地址
            for (int i = ips.Length - 1; i >= 0; i--)
            {
                if (ips[i].GetAddressBytes().Length == 4)
                {
                    myLocalEP = new IPEndPoint(ips[i], sockUDP.ListenPort);//获得本机局域网地址
                    break;
                }
            }

            UDPPacket ftMsg = new UDPPacket();
            ftMsg.type = (byte)TransmitType.getRemoteEP;//获得公网主机信息

            sockUDP.Send(ServerEP, ftMsg.BaseData);

            #region 与服务器保持通信
            //System.Timers.Timer timer = new System.Timers.Timer();
            //timer.Interval =30000;
            //timer.Enabled = true;
            //timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
            //{
            //    if (sockUDP != null)
            //    { 
            //      sockUDP.Send(ServerEP, ftMsg.BaseData);
            //    }
            //};
            #endregion

            #region 主机信息获取 时间计数器
            int TimeCount = 0;
            System.Timers.Timer timer1 = new System.Timers.Timer();
            timer1.Interval = 500;
            timer1.Enabled = true;
            timer1.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
            {
                if (myRemoteEP == null && TimeCount < 10)//如果还未获得本机远程主机信息
                {
                    sockUDP.Send(ServerEP, ftMsg.BaseData);//每隔500毫秒发送一次请求
                }
                else//如果三秒内已经获得主机信息或三秒钟后未获得主机信息
                {
                    //终止发送,并触发获得主机事件
                    timer1.Enabled = false;
                    timer1.Dispose();
                    timer1 = null;
                    if (myRemoteEP == null)//如果超时未获得本机远程主机信息
                        myRemoteEP = myLocalEP;//假设本机的远程IP等于本地IP

                    OnGetIPEndPoint(this, myLocalEP, myRemoteEP);//触发获取本机主机事件
                }
                TimeCount++;
            };
            #endregion
        }
예제 #3
0
        /// <summary>
        /// 开始
        /// </summary>
        public void Start()
        {
            if (sockUDP != null) return;//如果已经初始化套接字 ,则退出

            if (sockUDP == null)
            {
                sockUDP = new SockUDP();
                sockUDP.DataArrival += new SockUDP.UDPEventHandler(sockUDP_DataArrival);
                sockUDP.Listen(0);//随机侦听
            }

            IPEndPoint myLocalEP = null;
            System.Net.IPAddress[] ips = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());//获得本机局域网IPV4地址
            for (int i = ips.Length - 1; i >= 0; i--)
            {
                if (ips[i].GetAddressBytes().Length == 4)
                {
                    myLocalEP = new IPEndPoint(ips[i], sockUDP.ListenPort);//获得本机局域网地址
                    break;
                }
            }

            UDPFramePacket packet = new UDPFramePacket();
            packet.type = (byte)TransmitType.getRemoteEP;//获得公网主机信息
            packet.PacketCount = 1;
            sockUDP.Send(ServerEP, packet.BaseData);

            #region 主机信息获取 时间计数器
            int TimeCount = 0;
            System.Timers.Timer timer1 = new System.Timers.Timer();
            timer1.Interval = 500;
            timer1.Enabled = true;
            timer1.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
            {
                if (myRemoteEP == null && TimeCount < 10)//如果还未获得本机远程主机信息
                {
                    sockUDP.Send(ServerEP, packet.BaseData);//每隔500毫秒发送一次请求
                }
                else//如果三秒内已经获得主机信息或三秒钟后未获得主机信息
                {
                    //终止发送,并触发获得主机事件
                    timer1.Enabled = false;
                    timer1.Dispose();
                    timer1 = null;
                    if (myRemoteEP == null)//如果超时未获得本机远程主机信息
                        myRemoteEP = myLocalEP;//假设本机的远程IP等于本地IP
                    OnGetIPEndPoint(this, myLocalEP, myRemoteEP);//触发获取本机主机事件
                }
                TimeCount++;
            };
            #endregion


            ///开始组包线程
            videoThread = new System.Threading.Thread(new System.Threading.ThreadStart(VideoDecoderThread));
            videoThread.Start();
        }