private static void SendChunkCallback(IAsyncResult ar)
        {
            ChunkResponseState state   = (ChunkResponseState)ar.AsyncState;
            Socket             handler = state.Handler;
            int bytesSent = handler.EndSend(ar);

            if (state.Current < state.Total)
            {
                byte[] byteData = Encoding.ASCII.GetBytes(state.Data);
                var    offset   = byteData.Length / state.Total;
                var    length   = offset * state.Current;
                if (state.Total - state.Current == 1)
                {
                    length = byteData.Length - length;
                }
                state.Current++;

                if (state.SleepMilliseconds > 0)
                {
                    Thread.Sleep(state.SleepMilliseconds);
                }

                handler.BeginSend(byteData, offset, length, 0,
                                  new AsyncCallback(SendChunkCallback), state);
            }
            else
            {
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
        }
        private static void SendChunks(Socket handler, string data, int chunks, int sleepMs)
        {
            var state = new ChunkResponseState
            {
                Handler           = handler,
                Data              = data,
                Current           = 1,
                SleepMilliseconds = sleepMs
            };

            byte[] byteData = Encoding.ASCII.GetBytes(data);

            if (chunks <= 1)
            {
                handler.BeginSend(byteData, 0, byteData.Length, 0,
                                  new AsyncCallback(SendChunkCallback), state);
            }
            else
            {
                if (byteData.Length < chunks)
                {
                    handler.BeginSend(byteData, 0, byteData.Length, 0,
                                      new AsyncCallback(SendChunkCallback), state);
                }
                else
                {
                    state.Total = chunks;
                    handler.BeginSend(byteData, 0, byteData.Length / chunks, 0,
                                      new AsyncCallback(SendChunkCallback), state);
                }
            }
        }