public void Run() { try { //create an UDTServerSocket on a free port UDTServerSocket server = new UDTServerSocket(0); // do hole punching to allow the client to connect IPAddress clientAddress = IPAddress.Parse(clientIP); IPEndPoint point = new IPEndPoint(clientAddress, clientPort); //发送一字节确认端口 Util.DoHolePunch(server.getEndpoint(), point); int localPort = server.getEndpoint().LocalPort; //获取真实端口 //output client port writeToOut("OUT: " + localPort); //now start the send... UDTSocket socket = server.Accept(); UDTOutputStream outStream = socket.GetOutputStream(); FileInfo file = new FileInfo(localFilename); if (!file.Exists) { Console.WriteLine("没有文件:" + localFilename); socket.Close(); server.ShutDown(); return; } FileStream fis = new FileStream(localFilename, FileMode.Open); try { //send file size info long size = fis.Length; PacketUtil.Encode(size); outStream.Write(PacketUtil.Encode(size)); long start = DateTime.Now.Ticks; //and send the file Util.CopyFileSender(fis, outStream, size, false); long end = DateTime.Now.Ticks; Console.WriteLine(socket.GetSession().Statistics); float mbRate = 1000 * size / 1024 / 1024 / (end - start); float mbitRate = 8 * mbRate; Console.WriteLine("Rate: " + (int)mbRate + " MBytes/sec. " + mbitRate + " mbit/sec."); } finally { fis.Close(); socket.Close(); } } catch (Exception ex) { } }
/** * 立即关闭,shutdown取代 */ public void Stop() { //没有发送则可以直接关闭,不需要等待数据发送完成 try { socket.Close(); UDTSession serversession = socket.GetEndpoint().RemoveSession(socketID); if (serversession != null) { serversession.Socket.Close(); socket.GetReceiver().Stop(); socket.GetSender().Stop(); Console.WriteLine("物理关闭socket:" + serversession.SocketID); } serversession = null; } catch (IOException e) { Console.WriteLine(e); } Console.WriteLine("物理关闭socket"); }