@@ -444,10 +444,24 @@ private static Socket Connect(string serverName, int port, TimeoutTimer timeout,
444
444
445
445
Socket . Select ( checkReadLst , checkWriteLst , checkErrorLst , socketSelectTimeout ) ;
446
446
// nothing selected means timeout
447
+ SqlClientEventSource . Log . TrySNITraceEvent ( nameof ( SniTcpHandle ) , EventType . INFO ,
448
+ "Socket.Select results: checkReadLst.Count: {0}, checkWriteLst.Count: {1}, checkErrorLst.Count: {2}" ,
449
+ checkReadLst . Count , checkWriteLst . Count , checkErrorLst . Count ) ;
447
450
} while ( checkReadLst . Count == 0 && checkWriteLst . Count == 0 && checkErrorLst . Count == 0 ) ;
448
451
449
452
// workaround: false positive socket.Connected on linux: https://github.com/dotnet/runtime/issues/55538
450
453
isConnected = socket . Connected && checkErrorLst . Count == 0 ;
454
+ if ( ! isConnected )
455
+ {
456
+ // Retrieve the socket error code
457
+ int socketErrorCode = ( int ) socket . GetSocketOption ( SocketOptionLevel . Socket , SocketOptionName . Error ) ;
458
+ SocketError socketError = ( SocketError ) socketErrorCode ;
459
+
460
+ SqlClientEventSource . Log . TrySNITraceEvent ( nameof ( SniTcpHandle ) , EventType . ERR ,
461
+ "Socket connection failed. SocketError: {0} ({1})" , socketError , socketErrorCode ) ;
462
+
463
+ lastSocketException = new SocketException ( socketErrorCode ) ;
464
+ }
451
465
}
452
466
453
467
if ( isConnected )
@@ -465,6 +479,8 @@ private static Socket Connect(string serverName, int port, TimeoutTimer timeout,
465
479
}
466
480
pendingDNSInfo = new SQLDNSInfo ( cachedFQDN , iPv4String , iPv6String , port . ToString ( ) ) ;
467
481
isSocketSelected = true ;
482
+ SqlClientEventSource . Log . TrySNITraceEvent ( nameof ( SniTcpHandle ) , EventType . INFO ,
483
+ "Connected to socket: {0}" , socket . RemoteEndPoint ) ;
468
484
return socket ;
469
485
}
470
486
}
@@ -585,6 +601,20 @@ private static Socket ParallelConnect(IPAddress[] serverAddresses, int port, Tim
585
601
Socket . Select ( checkReadLst , checkWriteLst , checkErrorLst , socketSelectTimeout ) ;
586
602
// nothing selected means select timed out
587
603
} while ( checkReadLst . Count == 0 && checkWriteLst . Count == 0 && checkErrorLst . Count == 0 && ! timeout . IsExpired ) ;
604
+ foreach ( Socket socket in checkErrorLst )
605
+ {
606
+ // Retrieve the socket error code
607
+ int socketErrorCode = ( int ) socket . GetSocketOption ( SocketOptionLevel . Socket , SocketOptionName . Error ) ;
608
+ SocketError socketError = ( SocketError ) socketErrorCode ;
609
+
610
+ // Log any failed sockets
611
+ SqlClientEventSource . Log . TrySNITraceEvent ( nameof ( SniTcpHandle ) , EventType . INFO ,
612
+ "Socket connection failed for {0}. SocketError: {1} ({2})" ,
613
+ sockets [ socket ] , socketError , socketErrorCode ) ;
614
+
615
+ lastError = new SocketException ( socketErrorCode ) ;
616
+ }
617
+
588
618
}
589
619
catch ( SocketException e )
590
620
{
@@ -672,8 +702,13 @@ private static Socket ParallelConnect(IPAddress[] serverAddresses, int port, Tim
672
702
}
673
703
674
704
SqlClientEventSource . Log . TryAdvancedTraceEvent (
675
- "{0}.{1}{2}No socket connections succeeded. Last error: {3}" ,
705
+ "{0}.{1}{2} No socket connections succeeded. Last error: {3}" ,
676
706
nameof ( SniTcpHandle ) , nameof ( ParallelConnect ) , EventType . ERR , lastError ) ;
707
+
708
+ if ( lastError != null )
709
+ {
710
+ throw lastError ;
711
+ }
677
712
}
678
713
679
714
return connectedSocket ;
0 commit comments