NetAcceptSocket.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Threading;
  5. using Emby.Common.Implementations.Networking;
  6. using MediaBrowser.Model.Net;
  7. using MediaBrowser.Model.Logging;
  8. namespace Emby.Common.Implementations.Net
  9. {
  10. public class NetAcceptSocket : IAcceptSocket
  11. {
  12. public Socket Socket { get; private set; }
  13. private readonly ILogger _logger;
  14. public bool DualMode { get; private set; }
  15. public NetAcceptSocket(Socket socket, ILogger logger, bool isDualMode)
  16. {
  17. if (socket == null)
  18. {
  19. throw new ArgumentNullException("socket");
  20. }
  21. if (logger == null)
  22. {
  23. throw new ArgumentNullException("logger");
  24. }
  25. Socket = socket;
  26. _logger = logger;
  27. DualMode = isDualMode;
  28. }
  29. public IpEndPointInfo LocalEndPoint
  30. {
  31. get
  32. {
  33. return NetworkManager.ToIpEndPointInfo((IPEndPoint)Socket.LocalEndPoint);
  34. }
  35. }
  36. public IpEndPointInfo RemoteEndPoint
  37. {
  38. get
  39. {
  40. return NetworkManager.ToIpEndPointInfo((IPEndPoint)Socket.RemoteEndPoint);
  41. }
  42. }
  43. public void Connect(IpEndPointInfo endPoint)
  44. {
  45. var nativeEndpoint = NetworkManager.ToIPEndPoint(endPoint);
  46. Socket.Connect(nativeEndpoint);
  47. }
  48. public void Close()
  49. {
  50. #if NET46
  51. Socket.Close();
  52. #else
  53. Socket.Dispose();
  54. #endif
  55. }
  56. public void Shutdown(bool both)
  57. {
  58. if (both)
  59. {
  60. Socket.Shutdown(SocketShutdown.Both);
  61. }
  62. else
  63. {
  64. // Change interface if ever needed
  65. throw new NotImplementedException();
  66. }
  67. }
  68. public void Listen(int backlog)
  69. {
  70. Socket.Listen(backlog);
  71. }
  72. public void Bind(IpEndPointInfo endpoint)
  73. {
  74. var nativeEndpoint = NetworkManager.ToIPEndPoint(endpoint);
  75. Socket.Bind(nativeEndpoint);
  76. }
  77. private SocketAcceptor _acceptor;
  78. public void StartAccept(Action<IAcceptSocket> onAccept, Func<bool> isClosed)
  79. {
  80. _acceptor = new SocketAcceptor(_logger, Socket, onAccept, isClosed, DualMode);
  81. _acceptor.StartAccept();
  82. }
  83. public void Dispose()
  84. {
  85. Socket.Dispose();
  86. }
  87. }
  88. }