123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #if NETFX_CORE && !UNITY_EDITOR && !ENABLE_IL2CPP
- using System;
- using Windows.Networking;
- using Windows.Networking.Sockets;
- namespace BestHTTP.PlatformSupport.TcpClient.WinRT
- {
- public sealed class TcpClient : IDisposable
- {
- #region Public Properties
- public bool Connected { get; private set; }
- public TimeSpan ConnectTimeout { get; set; }
- #endregion
- #region Private Properties
- internal StreamSocket Socket { get; set; }
- private System.IO.Stream Stream { get; set; }
- #endregion
- public TcpClient()
- {
- ConnectTimeout = TimeSpan.FromSeconds(2);
- }
- public void Connect(string hostName, int port)
- {
- //How to secure socket connections with TLS/SSL:
- //http://msdn.microsoft.com/en-us/library/windows/apps/jj150597.aspx
- //Networking in Windows 8 Apps - Using StreamSocket for TCP Communication
- //http://blogs.msdn.com/b/metulev/archive/2012/10/22/networking-in-windows-8-apps-using-streamsocket-for-tcp-communication.aspx
- Socket = new StreamSocket();
- Socket.Control.KeepAlive = true;
- Socket.Control.NoDelay = true;
- var host = new HostName(hostName);
- System.Threading.CancellationTokenSource tokenSource = new System.Threading.CancellationTokenSource();
- // https://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj710176.aspx#content
- try
- {
- if (ConnectTimeout > TimeSpan.Zero)
- tokenSource.CancelAfter(ConnectTimeout);
- var task = Socket.ConnectAsync(host, port.ToString(), SocketProtectionLevel.PlainSocket).AsTask(tokenSource.Token);
- task.ConfigureAwait(false);
- task.Wait();
- Connected = task.IsCompleted;
- }
- catch(AggregateException ex)
- {
- //https://msdn.microsoft.com/en-us/library/dd537614(v=vs.110).aspx?f=255&MSPPError=-2147217396
- Connected = false;
- if (ex.InnerException != null)
- //throw ex.InnerException;
- {
- if ( ex.Message.Contains("No such host is known") || ex.Message.Contains("unreachable host") )
- throw new Exception("Socket Exception: " + ex.Message);
- else
- throw ex.InnerException;
- }
- else
- throw ex;
- }
- finally {
- // https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource
- tokenSource.Dispose();
- }
- if (!Connected)
- throw new TimeoutException("Connection timed out!");
- }
- public bool IsConnected()
- {
- return true;
- }
- public System.IO.Stream GetStream()
- {
- if (Stream == null)
- Stream = new DataReaderWriterStream(this);
- return Stream;
- }
- public void Close()
- {
- Dispose();
- }
- #region IDisposeble
- private bool disposed = false;
- private void Dispose(bool disposing)
- {
- if (!disposed)
- {
- disposed = true;
- if (disposing)
- {
- if (Stream != null)
- Stream.Dispose();
- Stream = null;
- Connected = false;
- this.Socket.Dispose();
- }
- }
- }
- ~TcpClient()
- {
- Dispose(false);
- }
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
- #endregion
- }
- }
- #endif
|