@@ -809,17 +809,29 @@ public override uint Send(SNIPacket packet)
809
809
}
810
810
811
811
/// <summary>
812
- /// Receive a packet synchronously
812
+ /// Receives a packet synchronously.
813
813
/// </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>
817
822
public override uint Receive ( out SNIPacket packet , int timeoutInMilliseconds )
818
823
{
819
824
SNIPacket errorPacket ;
820
825
lock ( this )
821
826
{
822
827
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
+
823
835
try
824
836
{
825
837
if ( timeoutInMilliseconds > 0 )
@@ -828,8 +840,7 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
828
840
}
829
841
else if ( timeoutInMilliseconds == - 1 )
830
842
{
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 ;
833
844
}
834
845
else
835
846
{
@@ -884,7 +895,9 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
884
895
}
885
896
finally
886
897
{
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 ;
888
901
}
889
902
}
890
903
}
0 commit comments