示例#1
0
        //UDPFileMsg RequestSendFilePakMsg = new UDPFileMsg();

        #region 私有方法

        #region sockUDP_DataArrival
        private void sockUDP_DataArrival(object sender, SockEventArgs e)
        {
            if (e.Data.Length < 21)
            {
                return;
            }
            UDPPacket fileMsg = new UDPPacket(e.Data);

            if (fileMsg.type == (byte)TransmitType.getFilePackage) //收到文件数据包
            {
                if (IsSend)                                        //如果是文件发送者,则按指定位置发送文件
                {
                    sendFile(fileMsg.LastPos);
                }
                else//如果是文件接收者,处理接收文件数据包
                {
                    ReceivedFileBlock(fileMsg);
                }
            }
            else if (fileMsg.type == (byte)TransmitType.Penetrate)//收到另一客户端请求打洞
            {
                toEP = e.RemoteIPEndPoint;
                if (fileMsg.Block.Length > mtu)//确定MTU值
                {
                    mtu = fileMsg.Block.Length;
                }

                if (TFileInfo.connectedType == ConnectedType.None) //如果还未连接,继续打洞
                {
                    sockUDP.Send(toEP, fileMsg.BaseData);          //告之对方收到打洞包并向对方打洞
                }
            }
            else if (fileMsg.type == (byte)TransmitType.getRemoteEP)//收到自己的远程主机信息
            {
                if (myRemoteEP == null)
                {
                    myRemoteEP = new IPEndPoint(fileMsg.RemoteIP, fileMsg.Port);//设置自己的远程主机信息
                }
            }
            else if (fileMsg.type == (byte)TransmitType.over)
            {
                if (IsConnected == false) //如果文件传输结束标识为false
                {
                    IsConnected = true;   //文件传输结束标识为真
                    if (FS != null)
                    {
                        FS.Close(); FS.Dispose(); FS = null;
                    }
                    OnFileTransmitted();//触发文件传输完成
                }
            }
        }
示例#2
0
        void udpFileServer_DataArrival(object sender, SockEventArgs e)
        {
            if (e.Data.Length < 21)
            {
                return;                    //如果收到非法数据包则退出
            }
            UDPPacket fileMsg = new UDPPacket(e.Data);

            if (fileMsg.type == (byte)TransmitType.getFilePackage || fileMsg.type == (byte)TransmitType.over || fileMsg.type == (byte)TransmitType.Penetrate)
            {
                //客户端请求与另一客户端打洞或请求转发文件数据包到另一客户端
                IPEndPoint RemoteEP = new IPEndPoint(fileMsg.RemoteIP, fileMsg.Port); //获得消息接收者远程主机信息
                udpFileServer.Send(RemoteEP, fileMsg.BaseData);                       //将远程主机信息发送给客户端
            }
            else if (fileMsg.type == (byte)TransmitType.getRemoteEP)                  //客户端请求获取自己的远程主机信息
            {
                fileMsg.RemoteIP = e.RemoteIPEndPoint.Address;                        //设置客户端的远程IP
                fileMsg.Port     = e.RemoteIPEndPoint.Port;                           //设置客户端的远程UDP 端口
                udpFileServer.Send(e.RemoteIPEndPoint, fileMsg.BaseData);             //将远程主机信息发送给客户端
            }

            //if (DataArrival != null)
            //    DataArrival(this, new SockEventArgs(e.Data, e.RemoteIPEndPoint));
        }
示例#3
0
        void udpServer_DataArrival(object sender, SockEventArgs e)
        {
            if (e.Data.Length < 29)
            {
                return;                    //如果收到非法数据包则退出
            }
            //byte[] data = new byte[e.Count];
            //Buffer.BlockCopy(e.Buffer, 0, data, 0, e.Count);

            UDPFramePacket packet = new UDPFramePacket(e.Data);

            if (packet.type == (byte)TransmitType.Audio || packet.type == (byte)TransmitType.Video)
            {
                //客户端请求与另一客户端打洞或请求转发文件数据包到另一客户端
                IPEndPoint RemoteEP = new IPEndPoint(packet.RemoteIP, packet.Port); //获得消息接收者远程主机信息
                udpServer.Send(RemoteEP, packet.BaseData);                          //将远程主机信息发送给客户端
            }
            else if (packet.type == (byte)TransmitType.getRemoteEP)                 //客户端请求获取自己的远程主机信息
            {
                packet.RemoteIP = e.RemoteIPEndPoint.Address;                       //设置客户端的远程IP
                packet.Port     = e.RemoteIPEndPoint.Port;                          //设置客户端的远程UDP 端口
                udpServer.Send(e.RemoteIPEndPoint, packet.BaseData);                //将远程主机信息发送给客户端
            }
        }
示例#4
0
        private void sockUDP_DataArrival(object sender, SockEventArgs e)
        {
            if (e.Data.Length < 29)
            {
                return;
            }
            UDPFramePacket packet = new UDPFramePacket(e.Data);                                     //获得一侦数据的一个包

            if (packet.type == (byte)TransmitType.Video || packet.type == (byte)TransmitType.Audio) //收到音频视频数据包
            {
                if (packet.type == (byte)TransmitType.Video)                                        //触发视频数据到达事件
                {
                    OnRecVideoData(this, packet.Block);
                }
                else if (packet.type == (byte)TransmitType.Audio)//触发音频数据到达事件
                {
                    OnRecAudioData(this, packet.Block);
                }

                return;

                if (packet.PacketCount > 0 && packet.PacketCount < 33)//最大32个数据包
                {
                    lock (ReceiverFrames)
                    {
                        if (ReceiverFrames.ContainsKey(packet.Timestamp))//如果侦已经存在
                        {
                            frame f = ReceiverFrames[packet.Timestamp];
                            f.Add(packet);//将包添加到侦
                        }
                        else
                        {
                            frame f = new frame();                   //创建侦
                            f.Add(packet);                           //将包添加到侦
                            f.dateTime    = DateTime.Now;
                            f.type        = packet.type;             //设置侦类型
                            f.Timestamp   = packet.Timestamp;        //设置时间戳
                            f.PacketCount = packet.PacketCount;      //设置侦的包总数
                            ReceiverFrames.Add(packet.Timestamp, f); //添加侦
                        }
                    }
                }
            }
            else if (packet.type == (byte)TransmitType.Penetrate)//收到另一客户端请求打洞
            {
                toEP = e.RemoteIPEndPoint;
                if (packet.Block.Length > mtu)//确定MTU值
                {
                    mtu = packet.Block.Length;
                }
                if (connectedType == ConnectedType.None) //如果还未连接,继续打洞
                {
                    sockUDP.Send(toEP, packet.BaseData); //告之对方收到打洞包并向对方打洞
                }
            }
            else if (packet.type == (byte)TransmitType.getRemoteEP)//收到自己的远程主机信息
            {
                if (myRemoteEP == null)
                {
                    myRemoteEP = new IPEndPoint(packet.RemoteIP, packet.Port);//设置自己的远程主机信息
                }
            }
        }