jiowchern/Regulus.Remote

View on GitHub
Regulus.Network/Tcp/Connecter.cs

Summary

Maintainability
A
3 hrs
Test Coverage
using Regulus.Utility;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace Regulus.Network.Tcp
{
    public class Connecter : Peer
    {

        public Connecter() : base(new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {

        }

        public System.Threading.Tasks.Task<bool> Connect(EndPoint endpoint)
        {
            System.Net.Sockets.Socket socket = GetSocket();
            return System.Threading.Tasks.Task<bool>.Factory.FromAsync(
                (handler, obj) => socket.BeginConnect(endpoint, handler, null), _ResultConnect, null);
        }

        public Task Disconnect()
        {
            System.Net.Sockets.Socket socket = GetSocket();
            return System.Threading.Tasks.Task<bool>.Factory.FromAsync(
                (handler, obj) => socket.BeginDisconnect(false, handler, null), _ResultDisconnect, null);
            
        }

        private bool _ResultDisconnect(IAsyncResult arg)
        {
            bool result = false;
            try
            {

                GetSocket().EndDisconnect(arg);
                result = true;
            }
            catch (SystemException se)
            {
                Singleton<Log>.Instance.WriteInfo(se.ToString());
            }
            finally
            {

                Singleton<Log>.Instance.WriteInfo(string.Format("disconnect result {0}.", result));

            }
            return result;
        }

        private bool _ResultConnect(IAsyncResult Ar)
        {
            bool result = false;
            try
            {
                
                GetSocket().EndConnect(Ar);
                result = true;
            }            
            catch(SystemException se)
            {
                Singleton<Log>.Instance.WriteInfo(se.ToString());
            }
            finally
            {

                Singleton<Log>.Instance.WriteInfo(string.Format("connect result {0}.", result));

            }
            return result;
        }


    }
}