Exemple #1
0
        private static void SendToClient(object sockfile)
        {
            SocketAndFileName sf = (SocketAndFileName)sockfile;

            try
            {
                SendFile(sf.Socket, sf.FileName, sf.BreakPoint);
            }
            catch (System.Net.Sockets.SocketException es)
            {
                if (es.ErrorCode == 10054)
                {
                    Log("客户端断开", es);
                }
                else if (es.ErrorCode == 10053)
                {
                    Log("服务器主动断开", es);
                }
                else
                {
                    Log("SocketException", es);
                }
            }
            catch (Exception e)
            {
                if (e.GetType().FullName != "System.ObjectDisposedException")
                {
                    Log("Socket已经被销毁", e);
                }
                else
                {
                    Log("其它异常", e);
                }
            }
            finally
            {
                sf.Socket.Close();
                //sf.Socket.Dispose();
            }
        }
Exemple #2
0
        /// <summary>
        /// 开始文件下载服务(在服务器端)
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="maxConnectCount"></param>
        public static void StartDownloadServer(string ip, int port, int maxConnectCount = 255)
        {
            TcpListener serverListener = null;

            try
            {
                //构建监听器
                serverListener = new TcpListener(IPAddress.Parse(ip), port);
                serverListener.Start(maxConnectCount);
                stopServer = false;
                //监听客户连线请求
                while (!stopServer)
                {
                    Socket socket = serverListener.AcceptSocket(); //有客户请求连接
                    if (socket == null)
                    {
                        continue;
                    }

                    byte[] buffer = new Byte[socket.ReceiveBufferSize];
                    int    i      = socket.Receive(buffer); //接收请求数据.
                    if (i <= 0)
                    {
                        continue;
                    }
                    if (i > 4)
                    {
                        byte[] lenBytes = new byte[4];
                        for (int j = 0; j < 4; j++)
                        {
                            lenBytes[j] = buffer[j];
                        }
                        byte[] file = new byte[i - 4];
                        for (int j = 0; j < i - 4; j++)
                        {
                            file[j] = buffer[j + 4];
                        }
                        int               breakPoint = BitConverter.ToInt32(lenBytes, 0);
                        string            filename   = Byte2Str(file);
                        SocketAndFileName sf         = new SocketAndFileName();
                        sf.Socket     = socket;
                        sf.FileName   = filename;
                        sf.BreakPoint = breakPoint;
                        //采用多线程异步方式处理请求,以便不会阻塞后面的其它请求(以牺牲服务器CPU资源为代价)
                        Thread thr = new Thread(new ParameterizedThreadStart(SendToClient));
                        thr.Start(sf);
                    }
                }
            }
            catch (Exception e)
            {
                Log("StartDownloadServer出现异常,已停止文件下载服务监听", e);
            }
            finally
            {
                if (serverListener != null)
                {
                    serverListener.Stop();
                }
                stopServer = true;
            }
        }