@@ -809,17 +809,29 @@ public override uint Send(SNIPacket packet)
809809 }
810810
811811 /// <summary>
812- /// Receive a packet synchronously
812+ /// Receives a packet synchronously.
813813 /// </summary>
814- /// <param name="packet">SNI packet</param>
815- /// <param name="timeoutInMilliseconds">Timeout in Milliseconds</param>
816- /// <returns>SNI error code</returns>
814+ /// <param name="packet">The received SNI packet.</param>
815+ /// <param name="timeoutInMilliseconds">
816+ /// Timeout in milliseconds:
817+ /// - If greater than 0, sets the socket's receive timeout to the specified value.
818+ /// - If equal to -1, represents an infinite timeout (socket timeout is set to 0).
819+ /// - If less than -1 or equal to 0, results in a timeout error.
820+ /// </param>
821+ /// <returns>SNI error code indicating the result of the operation.</returns>
817822 public override uint Receive ( out SNIPacket packet , int timeoutInMilliseconds )
818823 {
819824 SNIPacket errorPacket ;
820825 lock ( this )
821826 {
822827 packet = null ;
828+
829+ if ( _socket == null )
830+ {
831+ SqlClientEventSource . Log . TrySNITraceEvent ( nameof ( SNITCPHandle ) , EventType . ERR , "Connection Id {0}, Socket is null." , args0 : _connectionId ) ;
832+ return ReportTcpSNIError ( 0 , SNICommon . ConnOpenFailedError , Strings . SNI_ERROR_10 ) ;
833+ }
834+
823835 try
824836 {
825837 if ( timeoutInMilliseconds > 0 )
@@ -828,8 +840,7 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
828840 }
829841 else if ( timeoutInMilliseconds == - 1 )
830842 {
831- // SqlClient internally represents infinite timeout by -1, and for TcpClient this is translated to a timeout of 0
832- _socket . ReceiveTimeout = 0 ;
843+ _socket . ReceiveTimeout = Timeout . Infinite ;
833844 }
834845 else
835846 {
@@ -884,7 +895,9 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
884895 }
885896 finally
886897 {
887- _socket . ReceiveTimeout = 0 ;
898+ // Reset the socket timeout to Timeout.Infinite after the receive operation is done
899+ // to avoid blocking the thread in case of a timeout error.
900+ _socket . ReceiveTimeout = Timeout . Infinite ;
888901 }
889902 }
890903 }
0 commit comments