Program.cs 4.05 KB
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SendFileToSocket
{
    class Program
    {
        class ReadState
        {
            public int BufferSize;
            public byte[] Buffer;
            public Stream Stream;
        }

        static int MaxBufferSize = 1024 * 512;

        static void Main(string[] args)
        {
            if (args.Length != 3)
            {
                _ShowUsage();
                return;
            }

            if (!File.Exists(args[2]))
            {
                _ShowUsage();
                return;
            }

            try
            {
                var ipAddress = default(IPAddress);
                try
                {
                    var addresses = Dns.GetHostAddresses(args[0]);
                    ipAddress = addresses[0];
                }
                catch
                {
                }

                if (ipAddress == default(IPAddress))
                    ipAddress = IPAddress.Parse(args[0]);
                
                var port = int.Parse(args[1]);

                var remoteEP = new IPEndPoint(ipAddress, port);

                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    socket.Connect(ipAddress, port);

                    using (var stream = new NetworkStream(socket, true))
                    {
                        var readState = new ReadState
                        {
                            BufferSize = MaxBufferSize,
                            Buffer = new byte[MaxBufferSize],
                            Stream = stream
                        };

                        stream.BeginRead(readState.Buffer, 0, readState.BufferSize, _OnReadCompleted, readState);
                        
                        using (var streamWriter = new StreamWriter(stream))
                        {
                            using (var file = File.OpenText(args[2]))
                            {
                                while (true)
                                {
                                    var line = file.ReadLine();
                                    if (line == null)
                                        break;
                                    streamWriter.WriteLine(line);
                                }

                                streamWriter.Flush();
                            }

                            while (!_ReadCompleted)
                            {
                                Thread.Sleep(100);
                                _ReadTimeout--;
                                if (_ReadTimeout < 0)
                                    break;
                            }
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                _ShowUsage();
            }
        }


        static volatile int _ReadTimeout = 10;
        static volatile bool _ReadCompleted = false;
        static void _OnReadCompleted(IAsyncResult ar)
        {
            _ReadTimeout = 10;

            var readState = ar.AsyncState as ReadState;
            if (readState == null)
                return;
            try
            {
                var readed = readState.Stream.EndRead(ar);
                if (readed == 0)
                {
                    _ReadCompleted = true;
                    return;
                }
                
                Console.WriteLine(Encoding.Default.GetString(readState.Buffer, 0, readed));

                readState.Stream.BeginRead(readState.Buffer, 0, readState.BufferSize, _OnReadCompleted, readState);
            }
            catch
            {
                _ReadCompleted = true;
            }
        }

        static void _ShowUsage()
        {
            Console.WriteLine("SendFileToSocket.exe <HOST> <PORT> <PATH-TO-FILE>");
        }
    }
}