Winsock API
Note: All of the the information on this site is Copyright © 1999, Computer Services Contracting, unless otherwise noted and can be used freely for any non-commercial use as long as credit is given to Computer Services Contracting and/or the noted author, and is presented here for educational purposes only. Contact Computer Services Contracting at for permission to use this information for commercial use.
I posted requests on many news groups asking for information about Winsock programming. I got quite a few bits and pieces, nothing very complete, allot of it was conflicting. I am trying to put it all together and post it to this site along with a bunch of other stuff.
As I work through this problem, it will be solved in a few phases. First, multiple mini-apps in WinSock blocked mode. Second, Rolled into a single app. Third, converted to non-blocked WinSock mode. Finally converted to Class modules and Controls.
All code is for a 32bit Windows environment.
Naming Conventions |
I will be using the "Visual Basic Programming Conventions from Microsoft Consulting Services" from Microsoft as a basis. I have some additions that I will be using. Type structures and classes will end in an underscore and an identifying suffix. This suffix is used as a prefix in the declaration. All API declarations are prefixed with "api". All Functions are prefixed with "fnc". All Subroutines are prefixed with "sub". |
Error Handling |
I think that Microsoft missed the boat when it didn't include access to
Module and Procedure names along with the Call Chain. I use a Collection to capture Call Chain Information. This process is contained in the module cscCallChain.bas. By putting an entry at the beginning and end of each process, a Call Chain that includes Module and Procedure names can be built. If an error occurs The entry is not removed and an error handling routine can use the Collection to print out a Call Chain along with the error information. In a production environment, this information would be logged and a more meaningful English message would be presented to the User. I don't use this in properties. All Dll functions that are used, are wrapped by VB code that converts error information returned by the function, to err.raise type errors. Dll subroutines can be called directly without the VB wrapper, but some will be wrapped anyway. All that is needed at this point, is to add an error handler in the procedure(s) that would pass control to VB. This limits the number of error handlers required by excluding any subordinate procedures from having an error handler in it. Note: I am providing cscCallChain.bas before it is complete. I will be adding documentation to it. |
Winsock Information |
The WinSock Dll procedures utilize a few Variable modifying functions in
many places. I have used the procedures mentioned in Microsoft article Q189323 HOWTO:
Convert Between Signed and Unsigned Numbers and Tip 22:
Converting DWords, Words, and Bytes and built cscVariables.bas. fncTrimNulls is one that I made myself. I used Articles Q154512 SAMPLE: Getting HostAddress Using Windows Sockets and Q160215 HOWTO: Obtain the Host IP Address Using Windows Sockets to build cscWinSock.bas. This is the module that provides access to the WinSock Dll. WinSockInfo project directions: Common.zip includes cscCallChain.bas, cscVariables.bas, cscUser.bas, cscMAC.bas and cscWinSock.bas. WinSockInfo.zip contains WinSockInfo.frm, WinSockInfo.frx, WinSockInfo.vbw and WinSockInfo.vbp After expanding the files open the WinSockInfo.vbp file and run it from VB. Note: I am providing cscVariables.bas and cscWinSock.bas (**Updated 2/12/99**)
before they are complete. I will be adding documentation to it. |
User Name |
I used article Q161394 VBA:
Sample Code to Retrieve the Current User Name to build cscUser.bas. As the title
of the article notes, This module retrieves the current User Name. Note: I am providing cscUser.bas before it is complete. I will be adding documentation to it. |
MAC Address |
I used article Q175472 HOWTO: Get
Network Adapter Address from Visual Basic to build cscMAC.bas. This module
retrieves the MAC address of the network adapter. Note: I am providing cscMAC.bas before it is complete. I will be adding documentation to it. |
Local Information |
In the WinSockInfo project, the data was displayed in text boxes.
In the LocalInfo project, data is displayed in a TreeView. LocalInfo project directions:
Common.zip includes cscCallChain.bas, cscVariables.bas, cscUser.bas, cscMAC.bas and cscWinSock.bas. LocalInfo.zip contains LocalInfo.frm, LocalInfo.frx, LocalInfo.vbw and LocalInfo.vbp After expanding the files open the LocalInfo.vbp file and run it from VB. LocalInfo displays the information contained in the WSADATA Type structure that is returned in the WSAStartup procedure, the Host Name from the GetHostName call, the IP addresses from the GetHostByName call, the user name returned from GetUser and the MAC address returned from the ASTAT type structure that is returned from the NETBIOS call. All of the information is displayed in a TreeView control. |
DNS Lookup and Reverse DNS Lookup. |
DNS lookups are performed by the GetHostByName and GetHostByAddr
functions of the Winsock Dll.and returned in the HOSTENT structure. The
GetHostByName was used in the LocalInfo project. I could not find any VB examples on
the Microsoft site for GetHostByAddr function. I used the Winsock.h file provided in
the Win32 SDK, the
Windows Sockets GetHostByAddr function definition, the
HOSTENT structure definition and WINSOCK.EXE- Windows
Sockets API Spec (ASCII .TXT) to define the GetHostByAddr declare statement and
followed the previous Microsoft examples to build the code. In the process of
working with the GetHostByAddr function I built code that retrieved the Alias names in the
HOSTENT structure and updated the LocalInfo project to include this information. The DNSLookup project displays the data in text boxes as did the WinSockInfo project. DNSLookup project directions: Common.zip includes cscCallChain.bas, cscVariables.bas, cscUser.bas, cscMAC.bas and cscWinSock.bas. DNSLookup.zip contains DNSLookup.frm, DNSLookup.frx, DNSLookup.vbw and DNSLookup.vbp After expanding the files open the DNSLookup.vbp file and run it from VB. In DNSLookup you can enter either a Domain Name or an IP Address to retrieve the DNS information. Errors creating the HOSTEN structure are reported in the Domain Name or IP Address field corresponding to the type of lookup made. To see Alias names, try a lookup for "www.mysite.com". To see Secondary IP addresses, try a lookup for "www.search.com". |
Ping |
It looks like in order to do a ping using Winsock, it must be able to do Raw connections. Microsoft did not support Raw connections in Winsock until version 2.0. They created a DLL called ICMP.Dll that would do the tasks. This would include ping and tracert. The best way would be to look for the ability to do Raw connections with Winsock and if that fails use ICMP.Dll. I think the first shot will be with straight ICMP.Dll. |
Tracert |
Tracert also uses Raw connections like ping. |
WhoIs |
CGI |