using System; using System.Collections.Generic; using System.Threading; namespace System.Net.Sockets { /// Represents an asynchronous socket operation. // Token: 0x020001EA RID: 490 public class SocketAsyncEventArgs : EventArgs, IDisposable { // Token: 0x06001084 RID: 4228 RVA: 0x0003018C File Offset: 0x0002E38C internal SocketAsyncEventArgs(bool policy) : this() { this.PolicyRestricted = policy; } /// Creates an empty instance. /// The platform is not supported. // Token: 0x06001085 RID: 4229 RVA: 0x0003019C File Offset: 0x0002E39C public SocketAsyncEventArgs() { this.AcceptSocket = null; this.Buffer = null; this.BufferList = null; this.BytesTransferred = 0; this.Count = 0; this.DisconnectReuseSocket = false; this.LastOperation = SocketAsyncOperation.None; this.Offset = 0; this.RemoteEndPoint = null; this.SendPacketsSendSize = -1; this.SocketError = SocketError.Success; this.SocketFlags = SocketFlags.None; this.UserToken = null; } /// The event used to complete an asynchronous operation. // Token: 0x14000026 RID: 38 // (add) Token: 0x06001086 RID: 4230 RVA: 0x0003020C File Offset: 0x0002E40C // (remove) Token: 0x06001087 RID: 4231 RVA: 0x00030228 File Offset: 0x0002E428 public event EventHandler Completed; /// Gets or sets the socket to use or the socket created for accepting a connection with an asynchronous socket method. /// The to use or the socket created for accepting a connection with an asynchronous socket method. // Token: 0x1700057F RID: 1407 // (get) Token: 0x06001088 RID: 4232 RVA: 0x00030244 File Offset: 0x0002E444 // (set) Token: 0x06001089 RID: 4233 RVA: 0x0003024C File Offset: 0x0002E44C public Socket AcceptSocket { get; set; } /// Gets the data buffer to use with an asynchronous socket method. /// A array that represents the data buffer to use with an asynchronous socket method. // Token: 0x17000580 RID: 1408 // (get) Token: 0x0600108A RID: 4234 RVA: 0x00030258 File Offset: 0x0002E458 // (set) Token: 0x0600108B RID: 4235 RVA: 0x00030260 File Offset: 0x0002E460 public byte[] Buffer { get; private set; } /// Gets or sets an array of data buffers to use with an asynchronous socket method. /// An that represents an array of data buffers to use with an asynchronous socket method. /// There are ambiguous buffers specified on a set operation. This exception occurs if a value other than null is passed and the property is also not null. // Token: 0x17000581 RID: 1409 // (get) Token: 0x0600108C RID: 4236 RVA: 0x0003026C File Offset: 0x0002E46C // (set) Token: 0x0600108D RID: 4237 RVA: 0x00030274 File Offset: 0x0002E474 [global::System.MonoTODO("not supported in all cases")] public IList> BufferList { get { return this._bufferList; } set { if (this.Buffer != null && value != null) { throw new ArgumentException("Buffer and BufferList properties cannot both be non-null."); } this._bufferList = value; } } /// Gets the number of bytes transferred in the socket operation. /// An that contains the number of bytes transferred in the socket operation. // Token: 0x17000582 RID: 1410 // (get) Token: 0x0600108E RID: 4238 RVA: 0x0003029C File Offset: 0x0002E49C // (set) Token: 0x0600108F RID: 4239 RVA: 0x000302A4 File Offset: 0x0002E4A4 public int BytesTransferred { get; private set; } /// Gets the maximum amount of data, in bytes, to send or receive in an asynchronous operation. /// An that contains the maximum amount of data, in bytes, to send or receive. // Token: 0x17000583 RID: 1411 // (get) Token: 0x06001090 RID: 4240 RVA: 0x000302B0 File Offset: 0x0002E4B0 // (set) Token: 0x06001091 RID: 4241 RVA: 0x000302B8 File Offset: 0x0002E4B8 public int Count { get; private set; } /// Gets or sets a value that specifies if socket can be reused after a disconnect operation. /// A that specifies if socket can be reused after a disconnect operation. // Token: 0x17000584 RID: 1412 // (get) Token: 0x06001092 RID: 4242 RVA: 0x000302C4 File Offset: 0x0002E4C4 // (set) Token: 0x06001093 RID: 4243 RVA: 0x000302CC File Offset: 0x0002E4CC public bool DisconnectReuseSocket { get; set; } /// Gets the type of socket operation most recently performed with this context object. /// A instance that indicates the type of socket operation most recently performed with this context object. // Token: 0x17000585 RID: 1413 // (get) Token: 0x06001094 RID: 4244 RVA: 0x000302D8 File Offset: 0x0002E4D8 // (set) Token: 0x06001095 RID: 4245 RVA: 0x000302E0 File Offset: 0x0002E4E0 public SocketAsyncOperation LastOperation { get; private set; } /// Gets the offset, in bytes, into the data buffer referenced by the property. /// An that contains the offset, in bytes, into the data buffer referenced by the property. // Token: 0x17000586 RID: 1414 // (get) Token: 0x06001096 RID: 4246 RVA: 0x000302EC File Offset: 0x0002E4EC // (set) Token: 0x06001097 RID: 4247 RVA: 0x000302F4 File Offset: 0x0002E4F4 public int Offset { get; private set; } /// Gets or sets the remote IP endpoint for an asynchronous operation. /// An that represents the remote IP endpoint for an asynchronous operation. // Token: 0x17000587 RID: 1415 // (get) Token: 0x06001098 RID: 4248 RVA: 0x00030300 File Offset: 0x0002E500 // (set) Token: 0x06001099 RID: 4249 RVA: 0x00030308 File Offset: 0x0002E508 public EndPoint RemoteEndPoint { get; set; } /// Gets or sets the size, in bytes, of the data block used in the send operation. /// An that contains the size, in bytes, of the data block used in the send operation. // Token: 0x17000588 RID: 1416 // (get) Token: 0x0600109A RID: 4250 RVA: 0x00030314 File Offset: 0x0002E514 // (set) Token: 0x0600109B RID: 4251 RVA: 0x0003031C File Offset: 0x0002E51C [global::System.MonoTODO("unused property")] public int SendPacketsSendSize { get; set; } /// Gets or sets the result of the asynchronous socket operation. /// A that represents the result of the asynchronous socket operation. // Token: 0x17000589 RID: 1417 // (get) Token: 0x0600109C RID: 4252 RVA: 0x00030328 File Offset: 0x0002E528 // (set) Token: 0x0600109D RID: 4253 RVA: 0x00030330 File Offset: 0x0002E530 public SocketError SocketError { get; set; } /// Gets the results of an asynchronous socket operation or sets the behavior of an asynchronous operation. /// A that represents the results of an asynchronous socket operation. // Token: 0x1700058A RID: 1418 // (get) Token: 0x0600109E RID: 4254 RVA: 0x0003033C File Offset: 0x0002E53C // (set) Token: 0x0600109F RID: 4255 RVA: 0x00030344 File Offset: 0x0002E544 public SocketFlags SocketFlags { get; set; } /// Gets or sets a user or application object associated with this asynchronous socket operation. /// An object that represents the user or application object associated with this asynchronous socket operation. // Token: 0x1700058B RID: 1419 // (get) Token: 0x060010A0 RID: 4256 RVA: 0x00030350 File Offset: 0x0002E550 // (set) Token: 0x060010A1 RID: 4257 RVA: 0x00030358 File Offset: 0x0002E558 public object UserToken { get; set; } // Token: 0x1700058C RID: 1420 // (get) Token: 0x060010A2 RID: 4258 RVA: 0x00030364 File Offset: 0x0002E564 public Socket ConnectSocket { get { SocketError socketError = this.SocketError; if (socketError != SocketError.AccessDenied) { return this.curSocket; } return null; } } // Token: 0x1700058D RID: 1421 // (get) Token: 0x060010A3 RID: 4259 RVA: 0x00030390 File Offset: 0x0002E590 // (set) Token: 0x060010A4 RID: 4260 RVA: 0x00030398 File Offset: 0x0002E598 internal bool PolicyRestricted { get; private set; } /// Frees resources used by the class. // Token: 0x060010A5 RID: 4261 RVA: 0x000303A4 File Offset: 0x0002E5A4 ~SocketAsyncEventArgs() { this.Dispose(false); } // Token: 0x060010A6 RID: 4262 RVA: 0x000303E0 File Offset: 0x0002E5E0 private void Dispose(bool disposing) { Socket acceptSocket = this.AcceptSocket; if (acceptSocket != null) { acceptSocket.Close(); } if (disposing) { GC.SuppressFinalize(this); } } /// Releases the unmanaged resources used by the instance and optionally disposes of the managed resources. // Token: 0x060010A7 RID: 4263 RVA: 0x0003040C File Offset: 0x0002E60C public void Dispose() { this.Dispose(true); } /// Represents a method that is called when an asynchronous operation completes. /// The event that is signaled. // Token: 0x060010A8 RID: 4264 RVA: 0x00030418 File Offset: 0x0002E618 protected virtual void OnCompleted(SocketAsyncEventArgs e) { if (e == null) { return; } EventHandler completed = e.Completed; if (completed != null) { completed(e.curSocket, e); } } /// Sets the data buffer to use with an asynchronous socket method. /// The offset, in bytes, in the data buffer where the operation starts. /// The maximum amount of data, in bytes, to send or receive in the buffer. /// There are ambiguous buffers specified. This exception occurs if the property is also not null and the property is also not null. /// An argument was out of range. This exception occurs if the parameter is less than zero or greater than the length of the array in the property. This exception also occurs if the parameter is less than zero or greater than the length of the array in the property minus the parameter. // Token: 0x060010A9 RID: 4265 RVA: 0x00030448 File Offset: 0x0002E648 public void SetBuffer(int offset, int count) { this.SetBufferInternal(this.Buffer, offset, count); } /// Sets the data buffer to use with an asynchronous socket method. /// The data buffer to use with an asynchronous socket method. /// The offset, in bytes, in the data buffer where the operation starts. /// The maximum amount of data, in bytes, to send or receive in the buffer. /// There are ambiguous buffers specified. This exception occurs if the property is also not null and the property is also not null. /// An argument was out of range. This exception occurs if the parameter is less than zero or greater than the length of the array in the property. This exception also occurs if the parameter is less than zero or greater than the length of the array in the property minus the parameter. // Token: 0x060010AA RID: 4266 RVA: 0x00030458 File Offset: 0x0002E658 public void SetBuffer(byte[] buffer, int offset, int count) { this.SetBufferInternal(buffer, offset, count); } // Token: 0x060010AB RID: 4267 RVA: 0x00030464 File Offset: 0x0002E664 private void SetBufferInternal(byte[] buffer, int offset, int count) { if (buffer != null) { if (this.BufferList != null) { throw new ArgumentException("Buffer and BufferList properties cannot both be non-null."); } int num = buffer.Length; if (offset < 0 || (offset != 0 && offset >= num)) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || count > num - offset) { throw new ArgumentOutOfRangeException("count"); } this.Count = count; this.Offset = offset; } this.Buffer = buffer; } // Token: 0x060010AC RID: 4268 RVA: 0x000304E0 File Offset: 0x0002E6E0 private void ReceiveCallback() { this.SocketError = SocketError.Success; this.LastOperation = SocketAsyncOperation.Receive; SocketError socketError = SocketError.Success; if (!this.curSocket.Connected) { this.SocketError = SocketError.NotConnected; return; } try { this.BytesTransferred = this.curSocket.Receive_nochecks(this.Buffer, this.Offset, this.Count, this.SocketFlags, out socketError); } finally { this.SocketError = socketError; this.OnCompleted(this); } } // Token: 0x060010AD RID: 4269 RVA: 0x00030574 File Offset: 0x0002E774 private void ConnectCallback() { this.LastOperation = SocketAsyncOperation.Connect; SocketError socketError = SocketError.AccessDenied; try { socketError = this.TryConnect(this.RemoteEndPoint); } finally { this.SocketError = socketError; this.OnCompleted(this); } } // Token: 0x060010AE RID: 4270 RVA: 0x000305CC File Offset: 0x0002E7CC private SocketError TryConnect(EndPoint endpoint) { this.curSocket.Connected = false; SocketError socketError = SocketError.Success; try { this.curSocket.seed_endpoint = endpoint; this.curSocket.Connect(endpoint); this.curSocket.Connected = true; } catch (SocketException ex) { socketError = ex.SocketErrorCode; } return socketError; } // Token: 0x060010AF RID: 4271 RVA: 0x0003063C File Offset: 0x0002E83C private void SendCallback() { this.SocketError = SocketError.Success; this.LastOperation = SocketAsyncOperation.Send; SocketError socketError = SocketError.Success; if (!this.curSocket.Connected) { this.SocketError = SocketError.NotConnected; return; } try { if (this.Buffer != null) { this.BytesTransferred = this.curSocket.Send_nochecks(this.Buffer, this.Offset, this.Count, SocketFlags.None, out socketError); } else if (this.BufferList != null) { this.BytesTransferred = 0; foreach (ArraySegment arraySegment in this.BufferList) { this.BytesTransferred += this.curSocket.Send_nochecks(arraySegment.Array, arraySegment.Offset, arraySegment.Count, SocketFlags.None, out socketError); if (socketError != SocketError.Success) { break; } } } } finally { this.SocketError = socketError; this.OnCompleted(this); } } // Token: 0x060010B0 RID: 4272 RVA: 0x00030774 File Offset: 0x0002E974 internal void DoOperation(SocketAsyncOperation operation, Socket socket) { this.curSocket = socket; ThreadStart threadStart; switch (operation) { case SocketAsyncOperation.Connect: threadStart = new ThreadStart(this.ConnectCallback); goto IL_6A; case SocketAsyncOperation.Receive: threadStart = new ThreadStart(this.ReceiveCallback); goto IL_6A; case SocketAsyncOperation.Send: threadStart = new ThreadStart(this.SendCallback); goto IL_6A; } throw new NotSupportedException(); IL_6A: new Thread(threadStart) { IsBackground = true }.Start(); } // Token: 0x04000E8D RID: 3725 private IList> _bufferList; // Token: 0x04000E8E RID: 3726 private Socket curSocket; } }