/// <summary> /// Queues a write request. /// </summary> protected void BeginWriteMessage(ArraySegment <byte> buffer, object state) { ServiceResult error = ServiceResult.Good; IMessageSocketAsyncEventArgs args = m_socket.MessageSocketEventArgs(); try { args.SetBuffer(buffer.Array, buffer.Offset, buffer.Count); args.Completed += OnWriteComplete; args.UserToken = state; if (!m_socket.SendAsync(args)) { // I/O completed synchronously if (args.IsSocketError || (args.BytesTransferred < buffer.Count)) { error = ServiceResult.Create(StatusCodes.BadConnectionClosed, args.SocketErrorString); HandleWriteComplete(null, state, args.BytesTransferred, error); args.Dispose(); } else { // success, call Complete OnWriteComplete(null, args); } } } catch (Exception ex) { error = ServiceResult.Create(ex, StatusCodes.BadTcpInternalError, "Unexpected error during write operation."); HandleWriteComplete(null, state, args.BytesTransferred, error); args.Dispose(); } }
/// <summary> /// Queues a write request. /// </summary> protected void BeginWriteMessage(BufferCollection buffers, object state) { ServiceResult error = ServiceResult.Good; IMessageSocketAsyncEventArgs args = m_socket.MessageSocketEventArgs(); try { args.BufferList = buffers; args.Completed += OnWriteComplete; args.UserToken = state; if (m_socket == null || !m_socket.SendAsync(args)) { // I/O completed synchronously if (args.IsSocketError || (args.BytesTransferred < buffers.TotalSize)) { error = ServiceResult.Create(StatusCodes.BadConnectionClosed, args.SocketErrorString); HandleWriteComplete(buffers, state, args.BytesTransferred, error); args.Dispose(); } else { OnWriteComplete(null, args); } } } catch (Exception ex) { error = ServiceResult.Create(ex, StatusCodes.BadTcpInternalError, "Unexpected error during write operation."); HandleWriteComplete(buffers, state, args.BytesTransferred, error); args.Dispose(); } }
/// <summary> /// Handles a write complete event. /// </summary> protected virtual void OnWriteComplete(object sender, IMessageSocketAsyncEventArgs e) { lock (DataLock) { ServiceResult error = ServiceResult.Good; try { Utils.TraceDebug("Bytes written: {0}", e.BytesTransferred); if (e.BytesTransferred == 0) { error = ServiceResult.Create(StatusCodes.BadConnectionClosed, "The socket was closed by the remote application."); } if (e.Buffer != null) { BufferManager.ReturnBuffer(e.Buffer, "OnWriteComplete"); } HandleWriteComplete((BufferCollection)e.BufferList, e.UserToken, e.BytesTransferred, error); } catch (Exception ex) { error = ServiceResult.Create(ex, StatusCodes.BadTcpInternalError, "Unexpected error during write operation."); HandleWriteComplete((BufferCollection)e.BufferList, e.UserToken, e.BytesTransferred, error); } } e.Dispose(); }