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