Hello all.
I'm using Sapero's excellent winsock2.inc in a program I'm writing just as an exercise in understanding winsock. I have come to a roadblock in figuring out how to retrieve information from the in_addr structure. I understand that gethostbyname and gethostbyaddr return information in a hostent structure, and that part of the hostent structure (h_addr_list) uses an in_addr structure to store addresses. Does anyone have an example showing the contents of this structure (in_addr) dereferenced?
Using the following code I can copy the hostent info returned by gethostbyname into my own hostent structure. From there I can print the h_name field and force out the first entry in the h_aliases field, although I don't think I'm getting the aliases appropriately.
if ptrHost <> 0 ' if Host Pointer references a valid structure (from gethostbyname)
' set local udt "myHost" = to winsock udt "hostent"
myHost.h_name = #<hostent>ptrHost.h_name ' official name of host
myHost.h_aliases = #<hostent>ptrHost.h_aliases ' alias list
myHost.h_addrtype = #<hostent>ptrHost.h_addrtype ' host address type
myHost.h_length = #<hostent>ptrHost.h_length ' length of address
' may be 4 or 6. (IPV4) or (IPV6)
myHost.h_addr_list = #<hostent>ptrHost.h_addr_list ' list of addresses
' h_addr_list is an in_addr structure representing IPv4 Internet addresses.
' or
' h_addr_list is an in6_addr structure representing IPv6 Internet addresses.
myHost.h_addr = #<hostent>ptrHost.h_addr ' address, for backward compatibility
PRINT
PRINT
pointer xyz = myHost.h_name
if xyz <> null
print "h_name " + #<string>xyz ' returns lb1.www.ms.akadns.net for gethostbyname(www.microsoft.com)
ENDIF
xyz = myHost.h_aliases ' returns www.microsoft.com for gethostbyname(www.microsoft.com)
xyz = #<pointer>xyz
if xyz <> null
print "h_aliases " + #<string>xyz
ENDIF
xyz = myHost.h_length
if xyz <> null
print "h_length " + STR$(#<int>xyz) ' returns 2079326212 for gethostbyname(www.microsoft.com)
ENDIF
xyz = myHost.h_addr_list
if xyz <> null
print "h_addr_list " + #<string>xyz
ENDIF
xyz = myHost.h_addr
if xyz <> null
print "h_addr " + #<string>xyz
ENDIF
endIF
It (hostent\in_addr) combine three things that severely confuse me: Pointers to Pointers, dereferencing and unions. None are too bad by themselves but combine them and my head hurts.
With the NCS library this is easier ;)
Anyway I normally get the IP address like this:
pointer AddrPtr = #<HOSTENT>HostPtr.#<POINTER>h_addr_list
IP = #<ULONG>AddrPtr[Index]
Where Index is normally 0.
Which gives an idea how to do multiple dereferencing.
Paul.
Here's a short example how to use h_name and h_addr_list:
$include "windowssdk.inc"
WSADATA wsd
WSAstartup(0x202, &wsd)
pointer p 'h30097.www3.hp.com
pointer pHost = gethostbyname("osdir.com")
settype pHost, hostent
if (pHost)
print "h_name: ", *pHost.*<string>h_name
print "h_aliases:"
p = *pHost.h_aliases
while (*<pointer>p)
' *<pointer>p = string address
print " - ", *<string>*<pointer>p
p += 4
endwhile
print "h_addr_list:"
p = *pHost.h_addr_list
while (*<pointer>p)
' *<pointer>p = address of 4 bytes array
print " - ", ToString(inet_ntoa(*<int>*<pointer>p))
p += 4
endwhile
endif
WSACleanup()
_system("pause")
sub ToString(pointer p),string
return *<string>p
endsub
Thanks very much guys. Paul, I do have the NCS library, just trying to dig a little deeper for my own edification.
Sapero, that's exactly what I was looking for. Thanks much!