ChannelDirectTcpip.SilverlightShared.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System.Net.Sockets;
  2. using System.Threading;
  3. namespace Renci.SshNet.Channels
  4. {
  5. internal partial class ChannelDirectTcpip
  6. {
  7. private readonly AutoResetEvent _sendEvent = new AutoResetEvent(false);
  8. private readonly AutoResetEvent _receiveEvent = new AutoResetEvent(false);
  9. partial void InternalSocketReceive(byte[] buffer, ref int read)
  10. {
  11. var bytesToRead = buffer.Length;
  12. var receivedTotal = 0; // how many bytes is already received
  13. do
  14. {
  15. var args = new SocketAsyncEventArgs();
  16. args.SetBuffer(buffer, receivedTotal, bytesToRead - receivedTotal);
  17. args.UserToken = _socket;
  18. args.RemoteEndPoint = _socket.RemoteEndPoint;
  19. args.Completed += OnReceive;
  20. _socket.ReceiveAsync(args);
  21. _receiveEvent.WaitOne(ConnectionInfo.Timeout);
  22. if (args.SocketError == SocketError.WouldBlock ||
  23. args.SocketError == SocketError.IOPending ||
  24. args.SocketError == SocketError.NoBufferSpaceAvailable)
  25. {
  26. // socket buffer is probably empty, wait and try again
  27. Thread.Sleep(30);
  28. continue;
  29. }
  30. if (args.SocketError != SocketError.Success)
  31. {
  32. throw new SocketException((int)args.SocketError);
  33. }
  34. var receivedBytes = args.BytesTransferred;
  35. if (receivedBytes > 0)
  36. {
  37. receivedTotal += receivedBytes;
  38. continue;
  39. }
  40. break;
  41. } while (receivedTotal < bytesToRead);
  42. }
  43. partial void InternalSocketSend(byte[] data)
  44. {
  45. var args = new SocketAsyncEventArgs();
  46. args.SetBuffer(data, 0, data.Length);
  47. args.UserToken = _socket;
  48. args.RemoteEndPoint = _socket.RemoteEndPoint;
  49. args.Completed += OnSend;
  50. _socket.SendAsync(args);
  51. _sendEvent.WaitOne(ConnectionInfo.Timeout);
  52. }
  53. private void OnReceive(object sender, SocketAsyncEventArgs e)
  54. {
  55. _receiveEvent.Set();
  56. }
  57. private void OnSend(object sender, SocketAsyncEventArgs e)
  58. {
  59. _sendEvent.Set();
  60. }
  61. }
  62. }