2009-09-07 18:18 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/source/rtl/hbsocket.c
    % modified hb_socketResolveAddr() to try use given address in
      raw form. On some platforms like MS-Windows it eliminates
      huge delay caused by unnecessary DNS lookup for addresses given
      in dot.number notation. It should be well seen in NETIO open
      operation if client program is compiled for windows.
This commit is contained in:
Przemyslaw Czerpak
2009-09-07 16:18:41 +00:00
parent c314a2e0ee
commit 41af9dc9e5
2 changed files with 60 additions and 40 deletions

View File

@@ -17,6 +17,14 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-09-07 18:18 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/rtl/hbsocket.c
% modified hb_socketResolveAddr() to try use given address in
raw form. On some platforms like MS-Windows it eliminates
huge delay caused by unnecessary DNS lookup for addresses given
in dot.number notation. It should be well seen in NETIO open
operation if client program is compiled for windows.
2009-09-07 13:35 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/compiler/hbmain.c
! fixed HB_TRACE() message - thanks to Tamas Tevesz for info.

View File

@@ -1587,7 +1587,6 @@ BOOL hb_socketInet6Addr( void ** pSockAddr, unsigned * puiLen,
{
#if defined( HB_HAS_INET6 )
struct sockaddr_in6 sa;
int err;
memset( &sa, 0, sizeof( sa ) );
sa.sin6_family = AF_INET6;
@@ -1608,7 +1607,7 @@ BOOL hb_socketInet6Addr( void ** pSockAddr, unsigned * puiLen,
else
{
#if defined( HB_HAS_INET_PTON )
err = inet_pton( AF_INET6, szAddr, &sa.sin6_addr );
int err = inet_pton( AF_INET6, szAddr, &sa.sin6_addr );
if( err > 0 )
{
*pSockAddr = memcpy( hb_xgrab( sizeof( sa ) + 1 ), &sa, sizeof( sa ) );
@@ -2573,70 +2572,83 @@ int hb_socketSelect( PHB_ITEM pArrayRD, BOOL fSetRD,
char * hb_socketResolveAddr( const char * szAddr, int af )
{
char * szResult = NULL;
#ifdef HB_HAS_ADDRINFO
struct addrinfo hints, *res = NULL;
hb_vmUnlock();
#if defined( HB_SOCKET_TRANSLATE_DOMAIN )
af = hb_socketTransDomain( af, NULL );
#endif
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = af;
if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 )
{
szResult = hb_socketAddrGetName( res->ai_addr, res->ai_addrlen );
freeaddrinfo( res );
}
hb_vmLock();
#else
BOOL fTrans = FALSE;
if( af == HB_SOCKET_PF_INET )
{
struct hostent * he = NULL;
struct in_addr sin;
#if defined( HB_HAS_INET_PTON )
fTrans = inet_pton( AF_INET, szAddr, &sin ) > 0;
#elif defined( HB_HAS_INET_ATON )
fTrans = inet_aton( szAddr, &sin ) != 0;
#else
sin.s_addr = inet_addr( szAddr );
fTrans = sin.s_addr != INADDR_NONE ||
strcmp( "255.255.255.255", szAddr ) == 0; /* dirty hack */
#endif
hb_vmUnlock();
/* gethostbyname() in Windows and OS2 does not accept direct IP
* addresses
*/
#if defined( HB_OS_WIN ) || defined( HB_OS_OS2 )
#if !defined( HB_HAS_ADDRINFO )
if( !fTrans )
{
ULONG addr = inet_addr( szAddr );
if( addr != INADDR_NONE || strcmp( "255.255.255.255", szAddr ) == 0 )
he = gethostbyaddr( ( const char * ) &addr, sizeof( addr ), AF_INET );
struct hostent * he;
hb_vmUnlock();
he = gethostbyname( szAddr );
if( he && he->h_addr_list[ 0 ] )
{
sin.s_addr = ( ( struct in_addr * ) he->h_addr_list[ 0 ] )->s_addr;
fTrans = TRUE;
}
hb_vmLock();
}
#endif
if( he == NULL )
he = gethostbyname( szAddr );
if( he && he->h_addr_list[ 0 ] )
if( fTrans )
{
struct in_addr * sin = ( struct in_addr * ) he->h_addr_list[ 0 ];
# if defined( HB_HAS_INET_NTOP )
char buf[ INET_ADDRSTRLEN ];
szAddr = inet_ntop( AF_INET, sin, buf, sizeof( buf ) );
szAddr = inet_ntop( AF_INET, &sin, buf, sizeof( buf ) );
# elif defined( HB_IS_INET_NTOA_MT_SAFE )
szAddr = inet_ntoa( *sin );
szAddr = inet_ntoa( sin );
# else
char buf[ INET_ADDRSTRLEN ];
szAddr = hb_inet_ntoa( sin, buf );
szAddr = hb_inet_ntoa( &sin, buf );
# endif
szResult = hb_strdup( szAddr );
}
hb_vmLock();
}
#if defined( HB_HAS_INET6 )
else if( af == HB_SOCKET_PF_INET6 )
{
#if defined( HB_HAS_INET_PTON )
struct in6_addr sin;
fTrans = inet_pton( AF_INET6, szAddr, &sin ) > 0;
#else
int TODO;
fTrans = FALSE;
#endif
}
#endif
if( !fTrans )
{
#if defined( HB_HAS_ADDRINFO )
struct addrinfo hints, *res = NULL;
hb_vmUnlock();
# if defined( HB_SOCKET_TRANSLATE_DOMAIN )
af = hb_socketTransDomain( af, NULL );
# endif
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = af;
if( getaddrinfo( szAddr, NULL, &hints, &res ) == 0 )
{
szResult = hb_socketAddrGetName( res->ai_addr, res->ai_addrlen );
freeaddrinfo( res );
}
hb_vmLock();
#endif
}
return szResult;
}