NetSocket.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 NetSocket : ISocket
  11. {
  12. public Socket Socket { get; private set; }
  13. private readonly ILogger _logger;
  14. public bool DualMode { get; private set; }
  15. public NetSocket(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 Close()
  44. {
  45. #if NET46
  46. Socket.Close();
  47. #else
  48. Socket.Dispose();
  49. #endif
  50. }
  51. public void Shutdown(bool both)
  52. {
  53. if (both)
  54. {
  55. Socket.Shutdown(SocketShutdown.Both);
  56. }
  57. else
  58. {
  59. // Change interface if ever needed
  60. throw new NotImplementedException();
  61. }
  62. }
  63. public void Listen(int backlog)
  64. {
  65. Socket.Listen(backlog);
  66. }
  67. public void Bind(IpEndPointInfo endpoint)
  68. {
  69. var nativeEndpoint = NetworkManager.ToIPEndPoint(endpoint);
  70. Socket.Bind(nativeEndpoint);
  71. }
  72. private SocketAcceptor _acceptor;
  73. public void StartAccept(Action<ISocket> onAccept, Func<bool> isClosed)
  74. {
  75. _acceptor = new SocketAcceptor(_logger, Socket, onAccept, isClosed, DualMode);
  76. _acceptor.StartAccept();
  77. }
  78. public void Dispose()
  79. {
  80. Socket.Dispose();
  81. }
  82. }
  83. }