Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Как определить подключён ли комп. к интернету? |
Автор: Klin 9.10.2002, 15:25 |
Как определить подключён ли компьютер к интернету и если кто знает как подключить и отключить. Заранее спасибо. |
Автор: Garik 9.10.2002, 17:17 |
В ФАКе по Делфи был такой вопрос. Переделать под Билдер проблемы не должно быть. |
Автор: Vit 9.10.2002, 23:11 |
http://www.forum.vingrad.ru/cgi-bin/newforum/ikonboard.cgi?act=ST;f=32;t=1919;hl=%E8%ED%F2%E5%F0%ED%E5%F2 |
Автор: Baa 10.10.2002, 00:36 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Klin 10.10.2002, 02:21 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Baa 10.10.2002, 03:33 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Klin 10.10.2002, 16:08 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: bercut 10.10.2002, 16:51 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Klin 16.10.2002, 18:02 |
Ну чё ни кто не знает ответ на вопрос? |
Автор: bercut 16.10.2002, 18:13 |
А какой вопрос-то ? А то ты их уже столько задал... ![]() |
Автор: Klin 16.10.2002, 22:29 |
Я имею в виду первый вопрос. |
Автор: bercut 16.10.2002, 22:43 |
Для того, чтобы узнать подключен ли комп к Инету, нужно просто пропинговать определенный адрес или даже несколько адресов. А чтобы отключить, в случаи подключения по диалапу, то просто грохнуть этот процесс и все. |
Автор: Klin 16.10.2002, 22:45 | ||
В смысле? |
Автор: bercut 16.10.2002, 22:50 |
Что тебе именно не понятно ? |
Автор: Klin 16.10.2002, 22:53 |
Грохнуть процес. Это всмысле типа Ctrl+alt+del. Если так, то как это сделать? |
Автор: bercut 16.10.2002, 23:07 |
В папке, где установлен у тебя C++Builder5 есть пример отслеживания процессов и их уничтожения. Вот эта папочка с примером, надеюсь разберешься: \Examples\Apps\Procview\ |
Автор: Vit 16.10.2002, 23:28 |
Модератор: Не надо превращать тему во флейм. Здесь обсуждается тема "Как определить подключён ли комп. к интернету?", для обсуждения других тем делайте другие топики. Ещё один офтоп и тема будет закрыта. |
Автор: bercut 16.10.2002, 23:38 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Baa 16.10.2002, 23:50 |
Флейм начался с пятого сообщения! Снятие задач не относится к вопросу: подключен ли комп к инету.
|
Автор: bercut 17.10.2002, 00:14 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Baa 17.10.2002, 01:44 |
Если у человека есть 10 вопросов, то пусть он создает 10 тем. |
Автор: Klin 17.10.2002, 01:55 |
Модератор: Удалено как не относящееся к теме обсуждения. PS. Обсудить форум и действия модераторов можно здесь: http://www.forum.vingrad.ru/cgi-bin/newforum/ikonboard.cgi?act=SF;f=27 |
Автор: Klin 17.10.2002, 01:58 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: neutrino 17.10.2002, 02:11 |
Модератор: Удалено как не относящееся к теме обсуждения.
|
Автор: Vit 17.10.2002, 03:56 |
По существу вопроса - для Билдера должна быть библиотека RasAPI- там есть функции для определения коннекта к интернету, но они работают только для модемного соединения. Во всех остальных случаях есть только 1 надёжный способ - попытаться загрузить web страничку с www.yahoo.com или www.microsoft.com или что-то типа этого. Почему так? Да просто потому что если мой комп стоит в локалке и подсоединён к прокси и к локальным Web серверам то операционная система искренне считает что она в интернете, даже если реального коннекта с остальным миром нет. Ping внешнего сервера как я выяснил не очень хорошо подходит, так как многие сервера и firewall запрещают протокол Ping - попробуйте например пропинговать: Ping www.microsoft.com - и получите timeout на все запросы. Следовательно лучше всего просто попытаться скачать страничку (на Билнере это легко можно сделать используя NMHTTP компонент). Однако и в данном случае возможны проблемы: например я могу поставить Firewall и прокси таким образом что доступ будет только, например, к домену Yahoo.com или например только к доменам находящимся на территории Гвинеи - как в этом случае считать есть интернет или нет? - очевидно что есть, но только толку от этого скорее всего буден немного. Следовательно мой ответ будет такой: 1) Если модемное соединение используйте модуль RasAPI 2) Если соединение неизвестно - пытайтесь скачать заведомо известо существующий сервер - лучше всего свой собственный - тут вы можете даже проверить корректность ответа - вы точно знаете что именно вы должны получить по запросу. 3) Не обольщатся и понимать что 100% корректного решения проблемы нет, так как само понятие интернет растяжимое, и наличие доступа к некоторым серверам еще не означает наличия выхода на все сервера. Следовательно проблему доступа надо решать не для доступа к "интернету", а "есть ли доступ к конкретному, нужному вам серверу". Чуть не забыл - проксисервер, Gateway и DNS сервер могут быть перенастроены очень даже хитро - возможно настроить так что Ping будет проходить на любой IP (просто firewall будет его ретранслировать на один и тот же адрес) и в ответ на запрос любой страницы Proxi будет выдавать одну и ту же страницу или какую-то свою страницу - причём без всяких ошибок! Поэтому наряду со скачиванием страницы с известного стабильного сервера желательна проверка контента - действительно ли он содержит ожидаемую страницу. Поэтому желательно пользоваться скачиванием со своего сервера - тогда вы точно знаете что надо ожидать в ответ. |
Автор: bercut 17.10.2002, 20:54 |
Вот исходный код Ping'a // // PingI.c -- Simple ping program using the proprietary // Microsoft ICMP API // #include <windows.h> #include <winsock.h> #include <stdio.h> #include <string.h> typedef struct tagIPINFO { u_char Ttl; // Time To Live u_char Tos; // Type Of Service u_char IPFlags; // IP flags u_char OptSize; // Size of options data u_char FAR *Options; // Options data buffer }IPINFO, *PIPINFO; typedef struct tagICMPECHO { u_long Source; // Source address u_long Status; // IP status u_long RTTime; // Round trip time in milliseconds u_short DataSize; // Reply data size u_short Reserved; // Unknown void FAR *pData; // Reply data buffer IPINFO ipInfo; // Reply options }ICMPECHO, *PICMPECHO; // ICMP.DLL Export Function Pointers HANDLE (WINAPI *pIcmpCreateFile)(VOID); BOOL (WINAPI *pIcmpCloseHandle)(HANDLE); DWORD (WINAPI *pIcmpSendEcho) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD); // // void main(int argc, char **argv) { WSADATA wsaData; // WSADATA ICMPECHO icmpEcho; // ICMP Echo reply buffer HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL HANDLE hndlFile; // Handle for IcmpCreateFile() LPHOSTENT pHost; // Pointer to host entry structure struct in_addr iaDest; // Internet address structure DWORD *dwAddress; // IP Address IPINFO ipInfo; // IP Options structure int nRet; // General use return code DWORD dwRet; // DWORD return code int x; // Check arguments if (argc != 2) { fprintf(stderr,"\nSyntax: pingi HostNameOrIPAddress\n"); return; } // Dynamically load the ICMP.DLL hndlIcmp = LoadLibrary("ICMP.DLL"); if (hndlIcmp == NULL) { fprintf(stderr,"\nCould not load ICMP.DLL\n"); return; } // Retrieve ICMP function pointers pIcmpCreateFile = (HANDLE (WINAPI *)(void)) GetProcAddress(hndlIcmp,"IcmpCreateFile"); pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) GetProcAddress(hndlIcmp,"IcmpCloseHandle"); pIcmpSendEcho = (DWORD (WINAPI *) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD)) GetProcAddress(hndlIcmp,"IcmpSendEcho"); // Check all the function pointers if (pIcmpCreateFile == NULL || pIcmpCloseHandle == NULL || pIcmpSendEcho == NULL) { fprintf(stderr,"\nError getting ICMP proc address\n"); FreeLibrary(hndlIcmp); return; } // Init WinSock nRet = WSAStartup(0x0101, &wsaData ); if (nRet) { fprintf(stderr,"\nWSAStartup() error: %d\n", nRet); WSACleanup(); FreeLibrary(hndlIcmp); return; } // Check WinSock version if (0x0101 != wsaData.wVersion) { fprintf(stderr,"\nWinSock version 1.1 not supported\n"); WSACleanup(); FreeLibrary(hndlIcmp); return; } // Lookup destination // Use inet_addr() to determine if we're dealing with a name // or an address iaDest.s_addr = inet_addr(argv[1]); if (iaDest.s_addr == INADDR_NONE) pHost = gethostbyname(argv[1]); else pHost = gethostbyaddr((const char *)&iaDest, sizeof(struct in_addr), AF_INET); if (pHost == NULL) { fprintf(stderr, "\n%s not found\n", argv[1]); WSACleanup(); FreeLibrary(hndlIcmp); return; } // Tell the user what we're doing printf("\nPinging %s [%s]", pHost->h_name, inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))); // Copy the IP address dwAddress = (DWORD *)(*pHost->h_addr_list); // Get an ICMP echo request handle hndlFile = pIcmpCreateFile(); for (x = 0; x < 4; x++) { // Set some reasonable default values ipInfo.Ttl = 255; ipInfo.Tos = 0; ipInfo.IPFlags = 0; ipInfo.OptSize = 0; ipInfo.Options = NULL; //icmpEcho.ipInfo.Ttl = 256; // Reqest an ICMP echo dwRet = pIcmpSendEcho( hndlFile, // Handle from IcmpCreateFile() *dwAddress, // Destination IP address NULL, // Pointer to buffer to send 0, // Size of buffer in bytes &ipInfo, // Request options &icmpEcho, // Reply buffer sizeof(struct tagICMPECHO), 5000); // Time to wait in milliseconds // Print the results iaDest.s_addr = icmpEcho.Source; printf("\nReply from %s Time=%ldms TTL=%d", inet_ntoa(iaDest), icmpEcho.RTTime, icmpEcho.ipInfo.Ttl); if (icmpEcho.Status) { printf("\nError: icmpEcho.Status=%ld", icmpEcho.Status); break; } } printf("\n"); // Close the echo request file handle pIcmpCloseHandle(hndlFile); FreeLibrary(hndlIcmp); WSACleanup(); } |
Автор: Klin 18.10.2002, 00:11 |
Спасибо, bercut. Тема-закрыта! |
Автор: NebelDT 29.9.2008, 12:15 |
Пропинговать - это хорошая идея, можно еше и проверить наличие загруженных служб или exe))... |
Автор: xvr 30.9.2008, 12:07 | ||
NebelDT а ты не хочешь 3е образование получить? Врача - реаниматора ![]() ![]() |
Автор: Alca 1.10.2008, 10:31 | ||||
Как определить тип подключения к сети при помощи InternetGetConnectedState Автор: Paul Marshal Компилятор: Visual Basic API функция InternetGetConnectedState содержится в wininet.dll (IE4 / IE5) и показывает состояние подключения к сети локальной системы. Она довольно проста в использовании и возвращает TRUE, если присутствует соединение с интернетом, иначе FALSE. Так же функция содержит параметр dwFlags. После вызова функции, dwFlags содержит состояние текущего соединения. Добавьте следующий код в секцию объявлений модуля BAS:
Добавьте на форму кнопку (Command1), шесть текстовых полей (Text1 - Text6). Установите в Text6 свойство Multiline в True и добавьте следующий код:
|
Автор: J0ker 1.10.2008, 16:38 |
аааааааааааа НЕКРОФИЛЫ АТАКУЮТ ![]() |