66
77#include " TCPClient.h"
88
9+ namespace
10+ {
11+
12+ std::string SockAddrToString (struct sockaddr *pAddr)
13+ {
14+ if (pAddr == nullptr )
15+ {
16+ return {};
17+ }
18+
19+ static char s[INET6_ADDRSTRLEN > INET_ADDRSTRLEN ? INET6_ADDRSTRLEN : INET_ADDRSTRLEN] = " \0 " ;
20+
21+ std::string strOut;
22+ switch (pAddr->sa_family )
23+ {
24+ case AF_INET: {
25+ struct sockaddr_in *pAddrIn = (struct sockaddr_in *)pAddr;
26+
27+ inet_ntop (AF_INET, &(pAddrIn->sin_addr ), s, INET_ADDRSTRLEN);
28+ strOut += s;
29+ strOut += ' :' ;
30+ strOut += std::to_string (ntohs (pAddrIn->sin_port ));
31+ break ;
32+ }
33+ case AF_INET6: {
34+ struct sockaddr_in6 *pAddrIn6 = (struct sockaddr_in6 *)pAddr;
35+
36+ inet_ntop (AF_INET6, &(pAddrIn6->sin6_addr ), s, INET6_ADDRSTRLEN);
37+ strOut += s;
38+ strOut += ' :' ;
39+ strOut += std::to_string (ntohs (pAddrIn6->sin6_port ));
40+ break ;
41+ }
42+ default :
43+ return {};
44+ }
45+ return strOut;
46+ }
47+
48+ } // namespace
49+
950CTCPClient::CTCPClient (const LogFnCallback oLogger, const SettingsFlag eSettings /* = ALL_FLAGS*/ )
1051 : ASocket(oLogger, eSettings),
1152 m_eStatus(DISCONNECTED),
@@ -239,57 +280,83 @@ bool CTCPClient::Connect(const std::string& strServer, const std::string& strPor
239280 * If socket(2) (or connect(2)) fails, we (close the socket
240281 * and) try the next address. */
241282
242- struct addrinfo * pTmpPtr = m_pResultAddrInfo;
283+ std::ostringstream strAddrList;
284+ size_t uTmpIndex = 0 ;
243285 size_t uSize = 0 ;
244- for (pTmpPtr = m_pResultAddrInfo; pTmpPtr != nullptr ; pTmpPtr = pTmpPtr->ai_next )
286+ struct addrinfo *pTmpPtr = m_pResultAddrInfo;
287+ for (pTmpPtr = m_pResultAddrInfo; pTmpPtr != nullptr ; pTmpPtr = pTmpPtr->ai_next , ++uTmpIndex)
245288 {
246- ++uSize;
289+ ++uSize;
290+ if (uTmpIndex != 0 )
291+ {
292+ strAddrList << " , " ;
293+ }
294+ strAddrList << StringFormat (" [%d] = '%s'" , uTmpIndex, SockAddrToString (pTmpPtr->ai_addr ).data ());
247295 }
248296
249297 std::uniform_int_distribution<size_t > RngGen (0 , uSize - 1 );
250298 size_t uStartIndex = 0 ;
251- if (uSize > 0 ) {
252- uStartIndex = RngGen (m_Rng);
299+ if (uSize > 0 )
300+ {
301+ uStartIndex = RngGen (m_Rng);
253302 }
254303
255304 if (m_eSettingsFlags & ENABLE_LOG)
256- m_oLog (StringFormat (" [TCPClient][Info] Got %d addresses from getaddrinfo, starting from index %d" , uSize,
257- uStartIndex));
305+ {
306+ m_oLog (StringFormat (" [TCPClient][Info] Got %d address%s from getaddrinfo, starting from index %d" , uSize,
307+ uSize > 1 ? " es" : " " , uStartIndex));
308+ m_oLog (StringFormat (" [TCPClient][Info] Address list: { %s }" , strAddrList.str ().data ()));
309+ }
258310
259- struct addrinfo * pResPtr = m_pResultAddrInfo;
260- for (size_t uIndex = 0 ; uIndex < uStartIndex; ++uIndex)
311+ struct addrinfo * pResPtr = m_pResultAddrInfo;
312+ for (size_t uIndex = 0 ; uIndex < uStartIndex; ++uIndex)
261313 {
262- pResPtr = pResPtr->ai_next ;
314+ pResPtr = pResPtr->ai_next ;
263315 }
264316
265- for (size_t uIndex = 0 ; uIndex < uSize; ++uIndex)
317+ uTmpIndex = uStartIndex;
318+ for (size_t uIndex = 0 ; uIndex < uSize; ++uIndex, ++uTmpIndex)
266319 {
267- // create socket
268- m_ConnectSocket = socket (pResPtr->ai_family , pResPtr->ai_socktype , pResPtr->ai_protocol );
269- if (m_ConnectSocket < 0 ) // or == -1
270- continue ;
271-
272- // connexion to the server
273- int iConRet = connect (m_ConnectSocket, pResPtr->ai_addr , pResPtr->ai_addrlen );
274- if (iConRet >= 0 ) // or != -1
275- {
276- /* Success */
277- m_eStatus = CONNECTED;
278-
279- if (m_pResultAddrInfo != nullptr ) {
280- freeaddrinfo (m_pResultAddrInfo);
281- m_pResultAddrInfo = nullptr ;
282- }
320+ // create socket
321+ m_ConnectSocket = socket (pResPtr->ai_family , pResPtr->ai_socktype , pResPtr->ai_protocol );
322+ if (m_ConnectSocket < 0 ) // or == -1
323+ continue ;
324+
325+ // connexion to the server
326+ int iConRet = connect (m_ConnectSocket, pResPtr->ai_addr , pResPtr->ai_addrlen );
327+ if (iConRet >= 0 ) // or != -1
328+ {
329+ /* Success */
330+ m_eStatus = CONNECTED;
331+
332+ if (m_eSettingsFlags & ENABLE_LOG)
333+ m_oLog (StringFormat (" [TCPClient][Info] Successfully connected to address %s at index %d" ,
334+ SockAddrToString (pResPtr->ai_addr ).data (), uTmpIndex));
335+
336+ if (m_pResultAddrInfo != nullptr )
337+ {
338+ freeaddrinfo (m_pResultAddrInfo);
339+ m_pResultAddrInfo = nullptr ;
340+ }
283341
284- return true ;
285- }
342+ return true ;
343+ }
344+
345+ if (m_eSettingsFlags & ENABLE_LOG)
346+ m_oLog (StringFormat (" [TCPClient][Info] Connection to address %s at index %d failed" ,
347+ SockAddrToString (pResPtr->ai_addr ).data (), uTmpIndex));
286348
287- if (pResPtr->ai_next == nullptr )
288- {
349+ if (pResPtr->ai_next == nullptr )
350+ {
351+ uTmpIndex = 0 ;
289352 pResPtr = m_pResultAddrInfo;
290- }
353+ }
354+ else
355+ {
356+ pResPtr = pResPtr->ai_next ;
357+ }
291358
292- close (m_ConnectSocket);
359+ close (m_ConnectSocket);
293360 }
294361
295362 if (m_pResultAddrInfo != nullptr )
@@ -302,7 +369,7 @@ bool CTCPClient::Connect(const std::string& strServer, const std::string& strPor
302369 if (m_eSettingsFlags & ENABLE_LOG)
303370 m_oLog (" [TCPClient][Error] no such host." );
304371
305- #endif
372+ #endif
306373
307374 return false ;
308375}
0 commit comments