[Решено][Код]Подключение к интернету
Как узнать подключён ли комп к инету или нет?
Бить, пока не признается. :D :D :D Фпоиск!
LPRASCONN lprasconn,
LPDWORD lpcb,
LPDWORD lpcConnections
);
DWORD dwErr = ERROR_SUCCESS;
DWORD dwRetries = 5;
DWORD dwConnections = 0;
RASCONN* lpRasConn = NULL;
//
// Loop through in case the information from RAS changes between calls.
//
while (dwRetries--)
{
//
// If the memory is allocated, free it.
//
if (NULL != lpRasConn)
{
HeapFree(GetProcessHeap(), 0, lpRasConn);
lpRasConn = NULL;
}
//
// Allocate the size needed for the RAS structure.
//
lpRasConn = HeapAlloc(GetProcessHeap(), 0, dwCb);
if (NULL == lpRasConn)
{
dwErr = ERROR_NOT_ENOUGH_MEMORY;
break;
}
//
// Set the structure size for version checking purposes.
//
lpRasConn->dwSize = sizeof(RASCONN);
//
// Call the RAS API then exit the loop if we are successful or an unknown
// error occurs.
//
dwErr = RasEnumConnections(
lpRasConn,
&dwCb,
&dwConnections);
if (ERROR_BUFFER_TOO_SMALL != dwErr)
{
break;
}
}
//
// In the success case, print the names of the connections.
//
if (ERROR_SUCCESS == dwErr)
{
DWORD i;
printf("The following RAS connections are currently active\n\n");
for (i = 0; i < dwConnections; i++)
{
printf("%s\n", lpRasConn.szEntryName);
}
}
else
{
printf("RasEnumConnections failed: Error = %d\n", dwErr);
}
//
// Free the memory if necessary.
//
if (NULL != lpRasConn)
{
HeapFree(GetProcessHeap(), 0, lpRasConn);
lpRasConn = NULL;
}
На него ругается Бульдер.
А можно определить ип и если он не локальный то комп подключен?
DWORD dwErr = ERROR_SUCCESS;
DWORD dwRetries = 5;
DWORD dwConnections = 0;
RASCONN* lpRasConn = NULL;
...
Этот код определяет есть ли подключенное соединение - что далеко не всегда тоже что и сабж. Во вторых как минимум одна ситуация будет давать ложное срабатываение и у тебя она никак не обрабатывается. Кроме того - тогда уж получай реальное количество рас подключений на компе - у меня их например ок 15. :)
zoh
Внимай добрым советам и юзай поиск. Тема проверки-установки соединения обсуждается как минимум раз ок 10. В простейшем случае достаточно использовать связку internetConnect\InternetOpen - если используется стандартный сервис типа HTTP/FTP/GOOPER.
Этот код определяет есть ли подключенное соединение - что далеко не всегда тоже что и сабж. Во вторых как минимум одна ситуация будет давать ложное срабатываение и у тебя она никак не обрабатывается. Кроме того - тогда уж получай реальное количество рас подключений на компе - у меня их например ок 15. :)
Пример взят из MSDN без каких-либо изменений... мне как-то не больно хочется писать весь код самому... Просто это один из способов, возможно и не совсем верный в данном случае...
А почему бы не пропинговать microsoft.com?
Скажите как тогда определить ип?
RasGetAutodialAddress - для RAS-соединения,
GetAdaptersInfo - для сетевого адаптера
---------------------------------
struct hostent FAR * gethostbyname (
const char FAR * name
);
---------------------------------
Нужно имяхоста немогу в ней разобраться.
и ещё вот код
-------------------------------------
Метод на основе GetSystemMetrics * *
Проверить соединение с Интернет можно при помощи функции API GetSystemMetrics:
function IsInternetConnected: Boolean;
begin
Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;
-------------------------------------
Всегда выдаёт что есть подключение
вот ещё что
---------------------------------
struct hostent FAR * gethostbyname (
const char FAR * name
);
---------------------------------
Нужно имяхоста немогу в ней разобраться.
В описании МС указано, что разработчики WS2 данную функцию не рекомендуют использовать, а вместо нее использовать getaddrinfo. А чего в ней разбираться? передаешь имя хоста - на выходе получаешь структуру hostent.
и ещё вот код
-------------------------------------
Метод на основе GetSystemMetrics * *
Проверить соединение с Интернет можно при помощи функции API GetSystemMetrics:
function IsInternetConnected: Boolean;
begin
Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;
-------------------------------------
Всегда выдаёт что есть подключение
Вполне может быть. По крайней мере один сетевой интерфейс подключен у тебя всегда - 127.0.0.1 - может быть это связано с этим. Мне не приходилось использовать эту функцию для подобных целей. Хотябы потому, что большая часть машин у меня работает в сети и подобная проверка может выявить проблему с сетевым кабелем но никак не соединение с интернетом. Я в подобной задаче использовал то что порекомендовал тебе:
try{
hInetOpen = InternetOpen("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914) ",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(!hInetOpen)LogEvents("Хедер инициализирован");
hInetConnection = InternetConnect(hInetOpen,"http://whois.com.ua",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
if(hInetConnection!=NULL){
//Подключились
return 0;
}
//Нет подключения
return 1;
}
catch(...){
...
//Например
int Er = GetLastError();
return Er;
}
}
__finally{
//В по завершении функции лучше все закрыть.
InternetCloseHandle(hInetConnection);
InternetCloseHandle(hInetOpen);
}
если планируешь ипользовать для работы фукции wininet - советую в первую очередь проверять флаг автономной работы.
В описании МС указано, что разработчики WS2 данную функцию не рекомендуют использовать, а uses WinInet
function IsConnection(URL:string):boolean;
var
hSession,hfile: hInternet;
dwindex,dwcodelen: dword;
dwcode: array[1..20] of char;
res: pchar;
begin
Result:= false;
if URL = '' then exit;
hSession:= InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil,
nil, 0);
if assigned(hsession) then
begin
hfile:= InternetOpenUrl(hsession,pchar(URL),nil,0,INTERNET_FLAG_RELOAD,0);
dwIndex:= 0;
dwCodeLen:= 10;
HttpQueryInfo(hfile,HTTP_QUERY_STATUS_CODE,@dwcode,dwcodeLen,dwIndex);
res:= pchar(@dwcode);
result:= (res ='200') or (res ='302');
if assigned(hfile) then InternetCloseHandle(hfile);
InternetCloseHandle(hsession);
end;
end;
IsConnection(microsoft.com') ...
---------------------------------------------
А это не лучше будет?
В консольной проге ругается на:
hInetOpen
InternetOpen("
INTERNET_OPEN_TYPE_PRECONFIG
)LogEvents(
InternetConnect
INTERNET_DEFAULT_HTTP_PORT
INTERNET_SERVICE_HTTP
InternetCloseHandle(
В библиотеке ничё подобного нет.
Если не трудно скинь исходник примера
или на мыло [EMAIL=zoh@bk.ru]zoh@bk.ru[/EMAIL]
А это не лучше будет?
ну тебе виднее. Я предпочитаю проверять соединение по более надежным службам чем мелкософтовский сайт. Это во первых. Во вторых, если тебе нужно просто проверить доступен сайт или нет - смысл загружать с него страницу? Достаточно просто получить ответ сервера что он доступен. Но особо глобальной разницы нет. Может быть твой вариан более надежен.
Функцию LogEvents вообще выкинь из кода - или объяви (и реализуй )ее в своем коде -
String Message = DateTimeToStr(Now())+"\t"+Msg;
Message=Message+"\n";
String tmp = GetCurrentDir();
SetCurrentDir(DirProg+"\\log");
ofstream file("message.log",ios::app);
file << Message.c_str();
file.close();
SetCurrentDir(tmp);
return;
}
она нужна только для логирования.
Функция
LPCTSTR lpszAgent,
DWORD dwAccessType,
LPCTSTR lpszProxyName,
LPCTSTR lpszProxyBypass,
DWORD dwFlags
);
доступна в библиотеке Wininet для ее использования тебе необходимо подключить одноименный заголовочный файл и либу (wininet.lib) как это сделать в делфи хз, но наверное както можно.:) или загрузить динамически. код рабочий на все сто процентов. Могу кинуть пример - правда если ты пишень в дельфях - чем он тебе поможет - да и собственно все критичные куски я уже привел.
А по делфи я привожу код:D
Щас я проверю идею и скажу.