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