public static void ReadContinuous(Socket socket, byte[] buffer, int offset, int size, Action <byte[], int, int> processReceivedBytesAction) { #if FEATURE_SOCKET_SYNC // do not time-out receive socket.ReceiveTimeout = 0; while (socket.Connected) { try { var bytesRead = socket.Receive(buffer, offset, size, SocketFlags.None); if (bytesRead == 0) { break; } processReceivedBytesAction(buffer, offset, bytesRead); } catch (SocketException ex) { if (IsErrorResumable(ex.SocketErrorCode)) { continue; } switch (ex.SocketErrorCode) { case SocketError.ConnectionAborted: case SocketError.ConnectionReset: // connection was closed return; case SocketError.Interrupted: // connection was closed because FIN/ACK was not received in time after // shutting down the (send part of the) socket return; default: throw; // throw any other error } } } #elif FEATURE_SOCKET_EAP var completionWaitHandle = new ManualResetEvent(false); var readToken = new ContinuousReceiveToken(socket, processReceivedBytesAction, completionWaitHandle); var args = new SocketAsyncEventArgs { RemoteEndPoint = socket.RemoteEndPoint, UserToken = readToken }; args.Completed += ReceiveCompleted; args.SetBuffer(buffer, offset, size); if (!socket.ReceiveAsync(args)) { ReceiveCompleted(null, args); } completionWaitHandle.WaitOne(); completionWaitHandle.Dispose(); if (readToken.Exception != null) { throw readToken.Exception; } #else #error Receiving data from a Socket is not implemented. #endif }
public static void ReadContinuous(Socket socket, byte[] buffer, int offset, int size, Action<byte[], int, int> processReceivedBytesAction) { #if FEATURE_SOCKET_SYNC // do not time-out receive socket.ReceiveTimeout = 0; while (socket.Connected) { try { var bytesRead = socket.Receive(buffer, offset, size, SocketFlags.None); if (bytesRead == 0) break; processReceivedBytesAction(buffer, offset, bytesRead); } catch (SocketException ex) { if (IsErrorResumable(ex.SocketErrorCode)) continue; switch (ex.SocketErrorCode) { case SocketError.ConnectionAborted: case SocketError.ConnectionReset: // connection was closed return; case SocketError.Interrupted: // connection was closed because FIN/ACK was not received in time after // shutting down the (send part of the) socket return; default: throw; // throw any other error } } } #elif FEATURE_SOCKET_EAP var completionWaitHandle = new ManualResetEvent(false); var readToken = new ContinuousReceiveToken(socket, processReceivedBytesAction, completionWaitHandle); var args = new SocketAsyncEventArgs { RemoteEndPoint = socket.RemoteEndPoint, UserToken = readToken }; args.Completed += ReceiveCompleted; args.SetBuffer(buffer, offset, size); if (!socket.ReceiveAsync(args)) { ReceiveCompleted(null, args); } completionWaitHandle.WaitOne(); completionWaitHandle.Dispose(); if (readToken.Exception != null) throw readToken.Exception; #else #error Receiving data from a Socket is not implemented. #endif }