SocketAsyncEventArgsProxy.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. namespace SuperSocket.SocketEngine.AsyncSocket
  9. {
  10. class SocketAsyncEventArgsProxy
  11. {
  12. public SocketAsyncEventArgs SocketEventArgs { get; private set; }
  13. public int OrigOffset { get; private set; }
  14. public bool IsRecyclable { get; private set; }
  15. private SocketAsyncEventArgsProxy()
  16. {
  17. }
  18. public SocketAsyncEventArgsProxy(SocketAsyncEventArgs socketEventArgs)
  19. : this(socketEventArgs, true)
  20. {
  21. }
  22. public SocketAsyncEventArgsProxy(SocketAsyncEventArgs socketEventArgs, bool isRecyclable)
  23. {
  24. SocketEventArgs = socketEventArgs;
  25. OrigOffset = socketEventArgs.Offset;
  26. SocketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(SocketEventArgs_Completed);
  27. IsRecyclable = isRecyclable;
  28. }
  29. static void SocketEventArgs_Completed(object sender, SocketAsyncEventArgs e)
  30. {
  31. var socketSession = e.UserToken as IAsyncSocketSession;
  32. if (socketSession == null)
  33. return;
  34. if (e.LastOperation == SocketAsyncOperation.Receive)
  35. {
  36. socketSession.AsyncRun(() => socketSession.ProcessReceive(e));
  37. }
  38. else
  39. {
  40. throw new ArgumentException("The last operation completed on the socket was not a receive");
  41. }
  42. }
  43. public void Initialize(IAsyncSocketSession socketSession)
  44. {
  45. SocketEventArgs.UserToken = socketSession;
  46. }
  47. public void Reset()
  48. {
  49. SocketEventArgs.UserToken = null;
  50. }
  51. }
  52. }