|
|
|
Morning All !
Well here is a problem. I am developing an application that needs to connect to the internet to perform an FTP transfer. Detecting the presence of a valid connection seems to be **** HARD !
Having read what’s seems to be available on developer sites, I feel the RasEnumConnections & RasGetConnectStatus have short comings and are too unreliable. (Worth pointing out that I have no experience of socket level programming)
A solution posted by Patrick Philippot seems to be what I need except the <iphlpapi.h> and lib are required and I spent many hours failing to install the SDK from Microsoft
Does anyone know of a way of detecting a valid Internet connection that wont invoke a 'dial up connection box' .
Many thanks boys and girls
Regards Philip....
|
|
|
|
|
Healdp wrote: Detecting the presence of a valid connection seems to be **** HARD !
Yup
Check out this article[^] for some ideas on how to tackle this problem.
The two most common elements in the universe are Hydrogen and stupidity. - Harlan Ellison
Awasu 2.2 [^]: A free RSS/Atom feed reader with support for Code Project.
|
|
|
|
|
Checking the routing table for a default route is the best technique I've come across so far as it does not require checking a URL, pinging an IP address, or other techniques that will not be entirely accurate in all contexts. It also does not invoke any RAS connection dialog boxes which makes it sound like what your looking for.
(You mentioned you cannot get the SDK installed. If you are using VC++ 6.0, you will need the February 2003 SDK or prior installed to use this or to at least get the header and .lib files. Any SDK after this is incompatible with VC++ 6.0 at least without jumping through numerous hoops to get it to work. If you are using VC++ 7.1, the SDK is available on your installation disks)
I got the idea from someone on CodeGuru before they upgraded their website and lost all the legacy comments. Unfortunately, I do not know the name of the person who passed on the idea so I can't give credit where credit is do but I'll pass it on...
The function to use is GetIpForwardTable(). I use a timer to periodically check for connectivity and update my status indicator accordingly. There is a slight delay maybe a second or two if you unplug the cable or plug it in (assuming your timer is set to fire every second). No noticeable delay when disabling the connection using a GUI tool.
Don't forget to include in StdAfx.h...
#include <iphlpapi.h> // For Routing table query
And make sure to reference the Platform SDK lib file...
iphlpapi.lib
BOOL CNetworkConnectionDlg::IsInternetAvailable(void)
{
MIB_IPFORWARDTABLE * pRoutingTable;
DWORD dwBufferSize=0;
BOOL bIsInternetAvailable=FALSE;
DWORD dwResult;
DWORD dwIndex;
DWORD dwRowCount;
// Get the required buffer size
GetIpForwardTable(NULL,&dwBufferSize,FALSE);
pRoutingTable=(MIB_IPFORWARDTABLE*)new BYTE[dwBufferSize];
// Attempt to fill buffer with routing table information
dwResult=GetIpForwardTable(pRoutingTable,&dwBufferSize,FALSE);
if (dwResult==NO_ERROR) {
dwRowCount=pRoutingTable->dwNumEntries; // Get row count
// Look for default route to gateway
for (dwIndex=0;dwIndex<dwRowCount;dwIndex++) {
if (pRoutingTable->table[dwIndex].dwForwardDest==0) { // Default route designated by 0.0.0.0 in table
bIsInternetAvailable=TRUE; // Found it
break; // Short circuit loop
}
}
}
delete pRoutingTable; // Clean up. Just say "No" to memory leaks
return bIsInternetAvailable;
}
|
|
|
|
|
Bob...
Thanks Very much for your comprehensive reply.
The solution you suggest is the solution I have tried, it is from CodeGuru. It seems it will be my best solution, however I must get the Platform SDK installed correctly !!!!!!
Having downloaded the SDK from Microsoft, I have no idea if it is the 2005 (latest) version or weather I have the 2003 February virsion installed. How can I check what I have installed ?? Cant find the 2003 SDK on their site at all !!
If you dont have time to help further, then Thanks agsain for your time !!
Regards Phill !
|
|
|
|
|
Are you using VC++ 6.0, or are you using 7(2002),7.1(2003), 0r 8(2005)?
Only 6.0 requires the February 2003 SDK or earlier. I have 7.1 and it comes with it's own SDK right out of the package. I also have 6.0 on the same machine but I have the 2000 Platform SDK installed and the February 2003 SDK installed in their own directory paths and my VC++ 6.0 IDE paths for the includes, libs, and source point to these respectively.
The February 2003 SDK is no longer available for free download. Microsoft unfortunatley saw an opportunity to make some money and now charges roughly $10 (US) for a disc. I have not checked recently to see if it's available for purchase still.
Another source was the CD that came with the book "Programming Server-Side Applications for Microsoft® Windows® 2000 by Jason Clark and Jeffrey Richter". It had a Platform SDK dated in 2000 that has these files.
(slightly off topic)
If you are using VC+ 6.0 but cannot find a compatible SDK, you may want to invest in VC++ 7.1 (aka 2003) for those programs that use the SDK, GDI+, etc... I prefer VC++ 6.0 but I'm finding VC++ 7.1 compiled code outperforms my VC++ 6.0 code even without compiling with the optimizing compiler turned on. I only program native code and the VC++ 7.1 IDE actually requires more time to develop certain types of applications but the tradeoffs seem to balance especially since Microsoft seems deadset on making life miserable for those of us who try and continue to develop with 6.0.
Visual Studio 2005 (at least the beta 2) was unbearably slow when I tried it out but I noticed most software venders are selling out or discontinuing VC++ 7.1 (2003) so I would snag a copy before your choices get limited even further. (CompUSA.com still has a few copies) I would have chose not to upgrade if it wasn't for the same issues you are now facing.
Good Luck and I hope a solution that is compatible with your needs develops for you.
Bob
|
|
|
|
|
Thanks for your help bob.
Im using V6.... Looks like Ill have to humt around for a Feb 2003 SDK disk or update my Studio version!! In the mean time Ill gloss over this requirement. At least I understand my problem a little better now. Although Im amazed this 'internet connected' issue hasnt been better addressed, still there you go !
Thanks again
Regards Philip
|
|
|
|
|
Healdp wrote: The solution you suggest is the solution I have tried, it is from CodeGuru
I've been trying for a while to locate the comment to the article at codeguru that had this idea but have been unable to locate it. You don't happen to have the article title by any chance.
The technique works so well and many ask for ways to detect an ISP/network connection so I thought I'd post it in an article for the benefit of all but I wanted to make sure to credit the person who passed the idea on. If I remember correctly, he also referred to someone else in a give credit where credit is do kinda way.
Its a shame the technique didn't make it into the codeguru "...Goodies..." book. They instead included one of the other half baked schemes that don't work well as a frontline detection technique. Some additional detection schemes would provide additional connectivity info after this initial check but only those techniques have made it into easy to find articles.
If you know the name of person to give credit to, that would also help.
Anyway, thanks in advance
Bob
|
|
|
|
|
http://www.codeguru.com/cpp/i-n/internet/generalinternet/comments.php/c3437/?thread=43800
|
|
|
|
|
Edwin Eefting &
Patrick Philippot
Thanks.
|
|
|
|
|
Thanks Bob for tou patience in answering . But still i think you are not clear with my requirement.
I have an internet connection and i am able to determine the connection too. My question is: "Is there a way to know whether the existing internet connection is through a dial-up connection or Wifi-connection or an Ethernet connection?"
If i get this it will be a breakthrough in my project.
Sunil
|
|
|
|
|
InternetGetConnectedState() from Wininet.dll.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" - mYkel - 21 Jun '04
"There's not enough blatant self-congratulatory backslapping in the world today..." - HumblePie - 21 Jun '05
Within you lies the power for good - Use it!
|
|
|
|
|
|
|
Hello everyone,
I think I am getting kinda slow but I can't figure out how to add my own *.lib library to the project in Visual C++. I have looked through all linker settings and can't find the one where I can specify which library to use. I don't want to compile and link with a makefile because I have already set up all my files in the project. Would be nice if you could help me.
Thanks!
|
|
|
|
|
In MSVC6 you do the followingL
1. Select "Project->Settings" from the main menu.
2. Make sure the project (parent node) is selected in the tree and not one of the files.
3. Select the "Link" tab.
4. In the "Category" combo select "Input".
5. In the "Additional library path:" edit control add the directory where the library can be found (just the directory, not including the actual library name) if not already present.
6. In the "Object/library modules:" edit add the library to the end of the list.
Steve
|
|
|
|
|
Hi Steve,
In Visual Studio 2005 it is a bit different, but close enough to your description so I have found it. Definitely, struggling with VC++ at 5:00am was not very productive work. Thanks much, man!
Nick
|
|
|
|
|
Can anyone point me to some persistence framework that i can include in an already existing MFC 7 project (mysql database...but that may change). Also, i'm looking for a gui development framework for the same project (tt was passed down to me a few days ago, and needs dramatic updating)
|
|
|
|
|
You could try the Boost Serialization library here[^].
Steve
|
|
|
|
|
|
|
thanks all. I was looking for something more in the lines of java's Hibernate system. The articles you pointed me to really helped.
Thanks
|
|
|
|
|
Hello all,
Currently, we are planning to do a project on WLAN Monitoring System in VC++.NET. We tried WRAPI. It is not showing any compilation error. But, finally, when it starts execution, it shows ntdll.dll initialization error. Why is it showing error? Also, immediately it is showing a Access Violation Error in user32.dll.
Please guide me.
|
|
|
|
|
i want to develop a plugin for internet explorer which should be activated when the print option on browser window is clicked...does anyone know how to capture the events from the browser.the plugin is being developed in VC++ (MFC)
|
|
|
|