private void StartGC() { Thread gc = new Thread(() => { while (true) { judpSocket socket = null; foreach (var item in dicMap) { if (!item.Key.TryGetTarget(out socket)) { UDTSession serversession = endPoint.RemoveSession(item.Value); if (serversession != null) { serversession.Socket.Close(); serversession.Socket.GetReceiver().Stop(); serversession.Socket.GetSender().Stop(); FlashLogger.Info("移除socket:" + item.Value); } } } } }); gc.IsBackground = true; gc.Name = "GCSocket"; if (!gc.IsAlive) { gc.Start(); } }
public string toString() { StringBuilder sb = new StringBuilder(); sb.Append("ConnectionHandshake ["); sb.Append("connectionType=").Append(connectionType); UDTSession session = GetSession(); if (session != null) { sb.Append(", "); sb.Append(session.Destination); } sb.Append(", mySocketID=").Append(socketID); sb.Append(", initialSeqNo=").Append(initialSeqNo); sb.Append(", packetSize=").Append(packetSize); sb.Append(", maxFlowWndSize=").Append(maxFlowWndSize); sb.Append(", socketType=").Append(socketType); sb.Append(", destSocketID=").Append(destinationID); if (cookie > 0) { sb.Append(", cookie=").Append(cookie); } sb.Append("]"); return(sb.ToString()); }
/** * 立即关闭,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"); }
public void run(object stateInfo) { TaskInfo ti = (TaskInfo)stateInfo; bool memMapped = false; try { Log.Write("Handling request from " + ti.socket.getSession().getDestination()); UDTInputStream inputStream = ti.socket.getInputStream(); UDTOutputStream outputStream = ti.socket.getOutputStream(); byte[] readBuf = new byte[32768]; //read file name info while (inputStream.Read(readBuf, 0, readBuf.Length) == 0) { Thread.Sleep(100); } ByteBuffer bb = new ByteBuffer(readBuf); //how many bytes to read for the file name //byte[] len = new byte[4]; byte[] len = bb.PopByteArray(4); if (ti.verbose) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < len.Length; i++) { sb.Append(len[i].ToString()); sb.Append(" "); } Log.Write("[SendFile] name length data: " + sb.ToString()); } long length = Util.decode(len, 0); if (verbose) { Log.Write("[SendFile] name length : " + length); } //byte[] fileName = new byte[(int)length]; byte[] fileName = bb.PopByteArray((int)length); string sfileName = Encoding.Default.GetString(fileName); if (!File.Exists(sfileName)) { Log.Write("[SendFile] Send the file does not exist : " + sfileName); return; } FileStream fis = new FileStream(sfileName, FileMode.Open, FileAccess.Read); Log.Write("[SendFile] File requested: " + sfileName); try { long size = fis.Length; Log.Write("[SendFile] File size: " + size); //send size info outputStream.Write(Util.encode64(size), 0, 8); outputStream.Flush(); //( System.DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks)/10000; //如果要得到Java中 System.currentTimeMillis() 一样的结果,就可以写成 上面那样,也可以这样写: // TimeSpan ts=new TimeSpan( System.DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks); //(long)ts.TotalMilliseconds; TimeSpan ts_start = new TimeSpan(System.DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks); long start = (long)ts_start.TotalMilliseconds; //and send the file if (memMapped) { copyFile(fis, outputStream); } else { Util.copySend(fis, outputStream, size, false); } while (true) { //UDTSender _udtsender = ti.socket.getSender(); //if (_udtsender.GetsendQueueCount() == 0) UDTSession _udtsession = ti.socket.getSession(); if (_udtsession.getState() == 4) { break; } else { Thread.Sleep(2000); } } Log.Write("[SendFile] Finished sending data."); TimeSpan ts_end = new TimeSpan(System.DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks); long end = (long)ts_end.TotalMilliseconds; Log.Write(ti.socket.getSession().getStatistics().toString()); double rate = 1000.0 * size / 1024 / 1024 / (end - start); Log.Write("[SendFile] Rate: " + Math.Round(rate, 3) + " MBytes/sec. " + Math.Round(8 * rate, 3) + " MBit/sec."); } finally { ti.socket.getSender().stop(); ti.socket.close(); if (fis != null) { fis.Close(); } } Log.Write("Finished request from " + ti.socket.getSession().getDestination()); } catch (Exception ex) { Log.Write("[SendFile] File err", ex); } }
public void SetSession(UDTSession session) { this.session = session; }
/** * 获取有数据socket * 并且移除其它无用socket * @return */ public UDTSocket GetSocket() { int index = -1; int size = list.Count; for (int i = 0; i < size; i++) { try { if (index == -1) { if (list[i].GetInputStream().IsHasData) { //已经找到;其余的移除关 index = i; i = -1;//重新遍历 } // UDTSession session = list[i].GetSession(); if (session.State == UDTSession.shutdown) { //说明已经关闭 list[i].Close(); long id = list[i].GetSession().SocketID; list[i].GetEndpoint().RemoveSession(id); list[i].GetReceiver().Stop(); list[i].GetSender().Stop(); list[i].GetSender().Pause(); list.RemoveAt(i); i--; } } else { // if (i == index) { continue; } else { list[i].Close(); long id = list[i].GetSession().SocketID; list[i].GetEndpoint().RemoveSession(id); list[i].GetReceiver().Stop(); list[i].GetSender().Stop(); list[i].GetSender().Pause(); FlashLogger.Info("移除无用socket:" + id); } } } catch (Exception e) { Console.WriteLine(e); } } if (index != -1) { return(list[index]); } return(null); }
public SimpleTCP(UDTSession session) : base(session) { }