/// <summary> /// Receive event handler for the newer ReceiveAsync socket call. /// </summary> /// <param name="e">The socket args for the completed receive operation.</param> private void ProcessReceive(SocketAsyncEventArgs e) { SIPStreamConnection streamConn = (SIPStreamConnection)e.UserToken; try { if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { byte[] buffer = streamConn.RecvSocketArgs.Buffer; streamConn.ExtractSIPMessages(this, buffer, e.BytesTransferred); streamConn.RecvSocketArgs.SetBuffer(buffer, streamConn.RecvEndPosn, buffer.Length - streamConn.RecvEndPosn); bool willRaiseEvent = streamConn.StreamSocket.ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e); } } else { OnSIPStreamDisconnected(streamConn, e.SocketError); } } catch (SocketException sockExcp) { OnSIPStreamDisconnected(streamConn, sockExcp.SocketErrorCode); } catch (Exception excp) { // There was an error processing the last message received. Remove the disconnected socket. logger.LogError($"Exception processing SIP {ProtDescr} stream receive on read from {e.RemoteEndPoint} closing connection. {excp.Message}"); OnSIPStreamDisconnected(streamConn, SocketError.Fault); } }
/// <summary> /// Callback for read operations on the SSL stream. /// </summary> private void OnReadCallback(IAsyncResult ar) { SIPStreamConnection sipStreamConnection = (SIPStreamConnection)ar.AsyncState; try { int bytesRead = sipStreamConnection.SslStream.EndRead(ar); if (bytesRead == 0) { // SSL stream was disconnected by the remote end point sending a FIN or RST. logger.LogDebug($"TLS socket disconnected by {sipStreamConnection.RemoteEndPoint}."); OnSIPStreamDisconnected(sipStreamConnection, SocketError.ConnectionReset); } else { sipStreamConnection.ExtractSIPMessages(this, sipStreamConnection.SslStreamBuffer, bytesRead); sipStreamConnection.SslStream.BeginRead(sipStreamConnection.SslStreamBuffer, sipStreamConnection.RecvEndPosn, sipStreamConnection.SslStreamBuffer.Length - sipStreamConnection.RecvEndPosn, new AsyncCallback(OnReadCallback), sipStreamConnection); } } catch (SocketException sockExcp) // Occurs if the remote end gets disconnected. { OnSIPStreamDisconnected(sipStreamConnection, sockExcp.SocketErrorCode); } catch (IOException ioExcp) { if (ioExcp.InnerException is SocketException) { OnSIPStreamDisconnected(sipStreamConnection, (ioExcp.InnerException as SocketException).SocketErrorCode); } else if (ioExcp.InnerException is ObjectDisposedException) { // This exception is expected when the TLS connection is closed and this method is waiting for a receive. OnSIPStreamDisconnected(sipStreamConnection, SocketError.Disconnecting); } else { logger.LogWarning($"IOException SIPTLSChannel OnReadCallback. {ioExcp.Message}"); OnSIPStreamDisconnected(sipStreamConnection, SocketError.Fault); } } catch (Exception excp) { logger.LogWarning($"Exception SIPTLSChannel OnReadCallback. {excp.Message}"); OnSIPStreamDisconnected(sipStreamConnection, SocketError.Fault); } }
/// <summary> /// Callback for read operations on the SSL stream. /// </summary> private void OnReadCallback(IAsyncResult ar) { SIPStreamConnection sipStreamConnection = (SIPStreamConnection)ar.AsyncState; try { int bytesRead = sipStreamConnection.SslStream.EndRead(ar); if (bytesRead == 0) { // SSL stream was disconnected by the remote end pont sending a FIN or RST. logger.LogDebug("TLS socket disconnected by {sipStreamConnection.ConnectionProps.RemoteEndPoint}."); OnSIPStreamDisconnected(sipStreamConnection.RemoteEndPoint, SocketError.ConnectionReset); } sipStreamConnection.ExtractSIPMessages(this, sipStreamConnection.SslStreamBuffer, bytesRead); sipStreamConnection.SslStream.BeginRead(sipStreamConnection.SslStreamBuffer, sipStreamConnection.RecvEndPosn, sipStreamConnection.SslStreamBuffer.Length - sipStreamConnection.RecvEndPosn, new AsyncCallback(OnReadCallback), sipStreamConnection); } catch (SocketException sockExcp) // Occurs if the remote end gets disconnected. { //logger.LogWarning($"SocketException SIPTLSChannel ReceiveCallback. Error code {sockExcp.SocketErrorCode}. {sockExcp}"); OnSIPStreamDisconnected(sipStreamConnection.RemoteEndPoint, sockExcp.SocketErrorCode); } catch (IOException ioExcp) { if (ioExcp.InnerException is SocketException) { OnSIPStreamDisconnected(sipStreamConnection.RemoteEndPoint, (ioExcp.InnerException as SocketException).SocketErrorCode); } else { logger.LogWarning($"IOException SIPTLSChannel ReceiveCallback. {ioExcp.Message}"); OnSIPStreamDisconnected(sipStreamConnection.RemoteEndPoint, SocketError.Fault); } } catch (Exception excp) { logger.LogWarning($"Exception SIPTLSChannel ReceiveCallback. {excp.Message}"); OnSIPStreamDisconnected(sipStreamConnection.RemoteEndPoint, SocketError.Fault); } }