Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[Решено][Код]Подключение к интернету

383
26 октября 2005 года
zoh
237 / / 03.04.2005
Как узнать подключён ли комп к инету или нет?
10
26 октября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by zoh
Как узнать подключён ли комп к инету или нет?


Бить, пока не признается. :D :D :D Фпоиск!

1.9K
26 октября 2005 года
mail0
137 / / 09.05.2005
DWORD RasEnumConnections(
LPRASCONN lprasconn,
LPDWORD lpcb,
LPDWORD lpcConnections
);

Код:
DWORD dwCb = sizeof(RASCONN);
    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;
    }
383
27 октября 2005 года
zoh
237 / / 03.04.2005
RASCONN
На него ругается Бульдер.

А можно определить ип и если он не локальный то комп подключен?
1
27 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by mail0

 
Код:
DWORD dwCb = sizeof(RASCONN);
    DWORD dwErr = ERROR_SUCCESS;
    DWORD dwRetries = 5;
    DWORD dwConnections = 0;
    RASCONN* lpRasConn = NULL;
...


Этот код определяет есть ли подключенное соединение - что далеко не всегда тоже что и сабж. Во вторых как минимум одна ситуация будет давать ложное срабатываение и у тебя она никак не обрабатывается. Кроме того - тогда уж получай реальное количество рас подключений на компе - у меня их например ок 15. :)
zoh
Внимай добрым советам и юзай поиск. Тема проверки-установки соединения обсуждается как минимум раз ок 10. В простейшем случае достаточно использовать связку internetConnect\InternetOpen - если используется стандартный сервис типа HTTP/FTP/GOOPER.

1.9K
27 октября 2005 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by kot_
Этот код определяет есть ли подключенное соединение - что далеко не всегда тоже что и сабж. Во вторых как минимум одна ситуация будет давать ложное срабатываение и у тебя она никак не обрабатывается. Кроме того - тогда уж получай реальное количество рас подключений на компе - у меня их например ок 15. :)


Пример взят из MSDN без каких-либо изменений... мне как-то не больно хочется писать весь код самому... Просто это один из способов, возможно и не совсем верный в данном случае...

А почему бы не пропинговать microsoft.com?

383
28 октября 2005 года
zoh
237 / / 03.04.2005
Скажите как тогда определить ип?
1
28 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by zoh
Скажите как тогда определить ип?


RasGetAutodialAddress - для RAS-соединения,
GetAdaptersInfo - для сетевого адаптера

383
28 октября 2005 года
zoh
237 / / 03.04.2005
вот ещё что

---------------------------------
struct hostent FAR * gethostbyname (

const char FAR * name
);
---------------------------------

Нужно имяхоста немогу в ней разобраться.

и ещё вот код
-------------------------------------
Метод на основе GetSystemMetrics * *
Проверить соединение с Интернет можно при помощи функции API GetSystemMetrics:
function IsInternetConnected: Boolean;
begin
Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;
-------------------------------------
Всегда выдаёт что есть подключение
1
28 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by zoh
вот ещё что

---------------------------------
struct hostent FAR * gethostbyname (

const char FAR * name
);
---------------------------------

Нужно имяхоста немогу в ней разобраться.


В описании МС указано, что разработчики WS2 данную функцию не рекомендуют использовать, а вместо нее использовать getaddrinfo. А чего в ней разбираться? передаешь имя хоста - на выходе получаешь структуру hostent.

Цитата:
Originally posted by zoh

и ещё вот код
-------------------------------------
Метод на основе GetSystemMetrics * *
Проверить соединение с Интернет можно при помощи функции API GetSystemMetrics:
function IsInternetConnected: Boolean;
begin
Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
end;
-------------------------------------
Всегда выдаёт что есть подключение


Вполне может быть. По крайней мере один сетевой интерфейс подключен у тебя всегда - 127.0.0.1 - может быть это связано с этим. Мне не приходилось использовать эту функцию для подобных целей. Хотябы потому, что большая часть машин у меня работает в сети и подобная проверка может выявить проблему с сетевым кабелем но никак не соединение с интернетом. Я в подобной задаче использовал то что порекомендовал тебе:

Код:
try{
 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 - советую в первую очередь проверять флаг автономной работы.
383
29 октября 2005 года
zoh
237 / / 03.04.2005
[QUOTE]Originally posted by kot_
В описании МС указано, что разработчики 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]
1
30 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by zoh

А это не лучше будет?


ну тебе виднее. Я предпочитаю проверять соединение по более надежным службам чем мелкософтовский сайт. Это во первых. Во вторых, если тебе нужно просто проверить доступен сайт или нет - смысл загружать с него страницу? Достаточно просто получить ответ сервера что он доступен. Но особо глобальной разницы нет. Может быть твой вариан более надежен.
Функцию LogEvents вообще выкинь из кода - или объяви (и реализуй )ее в своем коде -

Код:
void __fastcall TfmMainFtp::LogEvents(String Msg){
 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;
}

она нужна только для логирования.
Функция
 
Код:
HINTERNET InternetOpen(
  LPCTSTR lpszAgent,
  DWORD dwAccessType,
  LPCTSTR lpszProxyName,
  LPCTSTR lpszProxyBypass,
  DWORD dwFlags
);

доступна в библиотеке Wininet для ее использования тебе необходимо подключить одноименный заголовочный файл и либу (wininet.lib) как это сделать в делфи хз, но наверное както можно.:) или загрузить динамически. код рабочий на все сто процентов. Могу кинуть пример - правда если ты пишень в дельфях - чем он тебе поможет - да и собственно все критичные куски я уже привел.
383
30 октября 2005 года
zoh
237 / / 03.04.2005
Пример поможет так как я пишу на С++:D
А по делфи я привожу код:D

Щас я проверю идею и скажу.
61K
19 мая 2010 года
Wbgury
2 / / 19.05.2010
Очень тяжолый случай. Мне нужно написать программу которая будет автамотически (вообще без участия пользователя) подключаться к интернету, затем проверять свой IP адрес по базе данных, если его там нет то добавить и идти дальше, если есть то начать заного, затем (если IP нет в базе) переходить по ссылке которая введена в TextBox1 и на сайте переходить по всем ссылкам, потом ждать рендомно от TextBox2 до TextBox3 ( в секундах разумеется ), а затем во всех этих ссылках сного перейти по всем ссылкам, потом отключение от интернета (тоже без участия пользователя ) и это один цикл (а задавать цыклы в TextBox4), ну и потом к началу и опять идти по томуже адресу в TextBox1. А вконце всех циклов отчистить базу. Вот такая безумно сложная программа! Подскажите на чём лючше писать? Я так подумал C++ мой любимый язык да и написать на нём можно всё...
1
20 мая 2010 года
kot_
7.3K / / 20.01.2000
пока выдаю 5 баллов нарушения за стиль. И жду объяснений. Жду их ровно сутки - после этого выдам бан как спамеру.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог