Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        /**
         * 立即关闭,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");
        }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
 public void SetSession(UDTSession session)
 {
     this.session = session;
 }
Exemple #6
0
        /**
         * 获取有数据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);
        }
Exemple #7
0
 public SimpleTCP(UDTSession session) : base(session)
 {
 }