예제 #1
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);//将远程主机信息发送给客户端
            }
             
        }
예제 #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
        //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();//触发文件传输完成
                }
            }
        }
예제 #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);//设置自己的远程主机信息
            }
        }