public String EndReadLine(IAsyncResult ar) { AsyncReadLineRequest lRequest = (AsyncReadLineRequest)ar; try { if (lRequest.State == AsyncReadLineState.MaxLineLengthReached) { TriggerAsyncDisconnect(); Disconnect(); throw new ConnectionClosedException("Size limit for ReadLine() was exceeded."); } Byte[] lBuffer = lRequest.Data.ToArray(); if (lRequest.Data.Length > 0 && lBuffer[lRequest.Data.Length - 1] == 13) { return(Encoding.GetString(lBuffer, 0, (Int32)lRequest.Data.Length - 1)); // on the rare occasion that the split is between the #13 and the #10 } return(Encoding.GetString(lBuffer, 0, (Int32)lRequest.Data.Length)); } finally { lRequest.Data.Close(); } }
public IAsyncResult BeginReadLine(AsyncCallback callback, Object state) { if (!BufferedAsync) throw new Exception("BufferedAsync must be true to use BeginReadLine"); AsyncReadLineRequest lRequest; if (fBuffer != null) { for (Int32 i = fBufferStart; i < fBufferEnd; i++) { if (fBuffer[i] == 10) { Int32 lLen = i - fBufferStart; if (lLen > 0 && fBuffer[i - 1] == 13) lLen--; lRequest = new AsyncReadLineRequest(state, callback); lRequest.Data.Write(fBuffer, fBufferStart, lLen); lRequest.State = AsyncReadLineState.SyncDone; fBufferStart = i + 1; callback(lRequest); return lRequest; } } } lRequest = new AsyncReadLineRequest(state, callback); if (fBuffer != null) lRequest.Data.Write(fBuffer, fBufferStart, fBufferEnd - fBufferStart); else fBuffer = new Byte[BUFFER_SIZE]; fBufferStart = 0; fBufferEnd = 0; try { IntBeginRead(fBuffer, 0, fBuffer.Length, new AsyncCallback(IntReadLineCallback), lRequest); } catch (ObjectDisposedException) // disconnect from this side { TriggerAsyncDisconnect(); throw; } catch (SocketException) // disconnect { TriggerAsyncDisconnect(); throw; } return lRequest; }
private void IntReadLineCallback(IAsyncResult ar) { AsyncReadLineRequest lRequest = (AsyncReadLineRequest)ar.AsyncState; try { Int32 lCount = IntEndRead(ar); if (lCount == 0) { TriggerAsyncDisconnect(); return; } for (Int32 i = 0; i < lCount; i++) { if (fBuffer[i] != 10) { continue; } if (i > 0 && fBuffer[i - 1] == 13) { lRequest.Data.Write(fBuffer, 0, i - 1); } else { lRequest.Data.Write(fBuffer, 0, i); } fBufferStart = i + 1; fBufferEnd = lCount; lRequest.State = AsyncReadLineState.Done; lRequest.Callback(lRequest); return; } if (this.MaxLineLengthEnabled && (lRequest.Data.Length > this.MaxLineLength)) { fBufferStart = 0; fBufferEnd = lCount; lRequest.State = AsyncReadLineState.MaxLineLengthReached; lRequest.Callback(lRequest); return; } lRequest.Data.Write(fBuffer, 0, lCount); TriggerAsyncHaveIncompleteData(); IntBeginRead(fBuffer, 0, fBuffer.Length, IntReadLineCallback, lRequest); } catch (ObjectDisposedException) // disconnect from this side { TriggerAsyncDisconnect(); } catch (SocketException) // disconnect { TriggerAsyncDisconnect(); } catch (ArgumentException) { } catch (Exception) // different platforms throw different exceptions { TriggerAsyncDisconnect(); } }
public IAsyncResult BeginReadLine(AsyncCallback callback, Object state) { if (!BufferedAsync) { throw new Exception("BufferedAsync must be true to use BeginReadLine"); } AsyncReadLineRequest lRequest; if (fBuffer != null) { for (Int32 i = fBufferStart; i < fBufferEnd; i++) { if (fBuffer[i] != 10) { continue; } Int32 lLen = i - fBufferStart; if (lLen > 0 && fBuffer[i - 1] == 13) { lLen--; } lRequest = new AsyncReadLineRequest(state, callback); lRequest.Data.Write(fBuffer, fBufferStart, lLen); lRequest.State = AsyncReadLineState.SyncDone; fBufferStart = i + 1; callback(lRequest); return(lRequest); } } lRequest = new AsyncReadLineRequest(state, callback); if (fBuffer != null) { lRequest.Data.Write(fBuffer, fBufferStart, fBufferEnd - fBufferStart); } else { fBuffer = new Byte[BUFFER_SIZE]; } fBufferStart = 0; fBufferEnd = 0; try { IntBeginRead(fBuffer, 0, fBuffer.Length, IntReadLineCallback, lRequest); } catch (ObjectDisposedException) // disconnect from this side { TriggerAsyncDisconnect(); throw; } catch (SocketException) // disconnect { TriggerAsyncDisconnect(); throw; } return(lRequest); }