CallDLL ws2_32.dll - help needed
Blitz3D Forums/Blitz3D Beginners Area/CallDLL ws2_32.dll - help needed
| ||
1. How would I write a decls for the gethostname function? 2. Failing #1...I wish to make Blitz functions for all functions within "ws2_32.dll" hostname$ = GetHostName() Print hostname$ WaitKey() End Function GetHostName$() tempbuffer$ = String$(" ", 63) tempbank = CreateBank(Len(tempbuffer$)+4) PokeByte tempbank,Len(tempbuffer$),4 CallDLL ("ws2_32.dll", "gethostname", tempbank) For temp = 0 To Len(tempbuffer$)-1 tempbyte = PeekByte (tempbank,temp) If tempbyte <> 0 Then tempname$ = tempname$ + Chr$(PeekByte (tempbank,temp)) Next FreeBank tempbank Return tempname$ End Function |
| ||
FYI: Print GetEnv$("COMPUTERNAME") ;will return the hostname in all caps GetHostName$() ;returns as the system sees it |
| ||
Does anyone understand the hostent structure?struct hostent { char *h_name; /* Official name of host. */ char **h_aliases; /* Alias list. */ int h_addrtype; /* Host address type. */ int h_length; /* Length of address. */ char **h_addr_list; /* List of addresses from name server. */ #define h_addr h_addr_list[0] /* Address, for backward compatibility. */ }; The only thing I get is that the last 4 bytes are the local machine's ip address in reverse. |
| ||
Generally, I would recommend avoiding CallDLL, which has been deprecated in favor of userlibs/decls. Here's my example of how to use GetHostName, which works in either B3D or B+. ; .lib "ws2_32.dll" ; GetHostName%(name*, length%):"gethostname" ; (Make sure these two lines occur in a *.decls file in the userlibs folder) n = CreateBank(256) failed% = GetHostName(n, BankSize(n)) If Not failed Then Print BankToString(n) Else Print "Error code: "+failed EndIf Function BankToString$(bank) While PeekByte(bank, i) <> 0 s$ = s$ + Chr$(PeekByte(bank, i)) i = i + 1 Wend Return s$ End Function |
| ||
As for the hostent structure, it's kind of a pain. h_name is the address of the first character of the hostname. h_aliases is the address of the list off addresses of aliases -- you would need to use copymemory or something to get this, I think -- unless you didn't care about it, then that would make it easier for you. the next two are just normal ints that you can read straight off. h_addr_list os similar to h_aliases except it contains IP (probably) addresses. Do you have a more specific question? |
| ||
Why does h_aliases give a pointer to memory where nothing's at? And if it helps here is the byte order of the structure as seen by my computer: Byte(0) = 0 Byte(1) = 0 Byte(2) = 0 Byte(3) = 0 Byte(4) = 156 h_aliases Byte(5) = 236 Byte(6) = 142 Byte(7) = 9 Byte(8) = 0 Byte(9) = 0 Byte(10) = 0 Byte(11) = 0 Byte(12) = 192 My ip address is 192.168.1.100 Byte(13) = 168 Byte(14) = 1 Byte(15) = 100 |
| ||
Do you have some code I could play with? Or which function are you trying to use? |
| ||
The following is what I have now:Print GetHostName$() + " is the computer's hostname" HOSTENT = GetHostByName( GetHostName$() ) Print PeekInt(HOSTENT ,4) + " is the pointer to the aliases right?" Print "" Print "The following bytes are from HOSTENT" For x = 0 To 15 Print "Byte (" + x + ") = " +PeekByte (HOSTENT ,x) Next WaitKey() End Function GetHostByName(LocalHostName$) ;returns the memory address (integer) to where the HOSTENT is Return CallDLL("ws2_32.dll", "gethostbyname",LocalHostName$) End Function Function GetHostName$() tempbuffer$ = String$(" ", 63) tempbank = CreateBank(Len(tempbuffer$)+4) PokeByte tempbank,Len(tempbuffer$),4 CallDLL ("ws2_32.dll", "gethostname", tempbank) For temp = 0 To Len(tempbuffer$)-1 tempbyte = PeekByte (tempbank,temp) If tempbyte <> 0 Then tempname$ = tempname$ + Chr$(PeekByte (tempbank,temp)) Next FreeBank tempbank Return tempname$ End Function |
| ||
One thing I see right away is that HOSTENT is an actual memory address, and you're using PeekInt as if it reads straight from memory. That won't work. PeekInt reads from a BANK, which is 1 layer of abstraction away from direct memory access. What you should probably do is use RtlMoveMemory (kernel32) to copy the contents at HOSTENT into a bank that you can then read with Peek. Also, I'm not sure that the third parameter of CallDLL (for gethostbyname) will work with a string. It didn't with me. Instead of using LocalHostName$, I would use what's in tempbank (from the GetHostName function, but global). Is there some reason why you're using CallDLL instead of decls files? |
| ||
Yes I don't understand how to create a wrapper (which I've been told I need to do if I want to ensure the user of these functions don't see the banks involved) ... fyi...I'm learning Winsock so I can learn ICMP.dll :> (I'd like to be able to ping in bb) |
| ||
And Soja, I'd thought that the Hostent pointer [received from GetHostByName()] was the same kind of pointer that Hostent bytes 4-7 [h_aliases] was. |