@@ -781,17 +781,29 @@ public override uint Send(SNIPacket packet)
781
781
}
782
782
783
783
/// <summary>
784
- /// Receive a packet synchronously
784
+ /// Receives a packet synchronously.
785
785
/// </summary>
786
- /// <param name="packet">SNI packet</param>
787
- /// <param name="timeoutInMilliseconds">Timeout in Milliseconds</param>
788
- /// <returns>SNI error code</returns>
786
+ /// <param name="packet">The received SNI packet.</param>
787
+ /// <param name="timeoutInMilliseconds">
788
+ /// Timeout in milliseconds:
789
+ /// - If greater than 0, sets the socket's receive timeout to the specified value.
790
+ /// - If equal to -1, represents an infinite timeout (socket timeout is set to 0).
791
+ /// - If less than -1 or equal to 0, results in a timeout error.
792
+ /// </param>
793
+ /// <returns>SNI error code indicating the result of the operation.</returns>
789
794
public override uint Receive ( out SNIPacket packet , int timeoutInMilliseconds )
790
795
{
791
796
SNIPacket errorPacket ;
792
797
lock ( this )
793
798
{
794
799
packet = null ;
800
+
801
+ if ( _socket == null )
802
+ {
803
+ SqlClientEventSource . Log . TrySNITraceEvent ( nameof ( SNITCPHandle ) , EventType . ERR , "Connection Id {0}, Socket is null." , args0 : _connectionId ) ;
804
+ return ReportTcpSNIError ( 0 , SNICommon . ConnOpenFailedError , Strings . SNI_ERROR_10 ) ;
805
+ }
806
+
795
807
try
796
808
{
797
809
if ( timeoutInMilliseconds > 0 )
@@ -800,8 +812,7 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
800
812
}
801
813
else if ( timeoutInMilliseconds == - 1 )
802
814
{
803
- // SqlClient internally represents infinite timeout by -1, and for TcpClient this is translated to a timeout of 0
804
- _socket . ReceiveTimeout = 0 ;
815
+ _socket . ReceiveTimeout = Timeout . Infinite ;
805
816
}
806
817
else
807
818
{
@@ -856,7 +867,9 @@ public override uint Receive(out SNIPacket packet, int timeoutInMilliseconds)
856
867
}
857
868
finally
858
869
{
859
- _socket . ReceiveTimeout = 0 ;
870
+ // Reset the socket timeout to Timeout.Infinite after the receive operation is done
871
+ // to avoid blocking the thread in case of a timeout error.
872
+ _socket . ReceiveTimeout = Timeout . Infinite ;
860
873
}
861
874
}
862
875
}
0 commit comments