Показать полную графическую версию : Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах
ganselo, Я ещё не учёл такой момент, это кстати не учтено и в VT Checker - утилита пакетной проверки файлов на VirusTotal.com (http://forum.oszone.net/thread-183132.html), когда соединения с Инетом нет, то моя программа выдаёт ошибку, а VT Checker молча закрывается.
Как можно добавить код, чтобы проверялось наличие установленого соединения и если его небудет, то выдавало один MessageBox с сообщением
Отсутствует соединение с интереном
#include <stdio.h>
#include <wininet.h>
bool CheckConnection()
{
DWORD flags;
flags = INTERNET_CONNECTION_MODEM +
INTERNET_CONNECTION_LAN +
INTERNET_CONNECTION_PROXY;
return InternetGetConnectedState (&flags,0);
}
if(!CheckConnection()) {
MessageBox(0, "Отсутствует соединение с интереном", "Внимание", MB_OK + MB_ICONWARNING);
}
MSDN (http://msdn.microsoft.com/en-us/library/aa384702(VS.85).aspx)
ganselo, Я знаю, что что-то не так делаю, но что именно, понять не могу, посмотрите проект. (3 КБ)
Нужно подключить библиотеку wininet.lib.
#pragma comment(lib, "wininet.lib")
ganselo, Да, с этим скомпилировалось без ошибок. Но в любом случае, хоть есть подключение, хоть его нету, функция показывает сообщение - Инет работает. :( Прочитал MSDN (http://msdn.microsoft.com/en-us/library/aa384702(VS.85).aspx) с переводчиком, но вроде бы всё сделал как рекомендовалось.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(!CheckConnection()) {
MessageBox(0, "Отсутствует соединение с интернетом", "Внимание", MB_OK + MB_ICONWARNING);
}
else
Label1->Caption = "Инет работает!!!";
}
Почитал про эту функцию в инете, пишут, что не у всех работает.
Тогда можно попробовать так:
try{
HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
}
catch(EIdSocketError &se){
//если не удалось подключится, то возникнет это исключение
if(se.LastError == код ошибки, когда пытаемся коннектится с отсутствующим инетом)
MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
// ShowMessage(se.Message);
}
catch(Exception &e){
ShowMessage(e.Message);
}
ganselo, Искал в Нете решение, набрёл на похожее, только на делфи. Пробовал сам, но запутался с catch. Сейчас проверю. :)
var
connected: boolean;
begin
connected:=true;
//тут прописываем настройки idHTTP
try
idHTTP.Get('http://www.google.ru');
//в OnStatus можно прописать дисконнект на статусе "Connected", что б лишнего не качать
except
on e: exception do connected := false;
end;
if not connected then
ShowMessage('Нет инета')
else
ShowMessage('Есть инет');
end;
Там же нашёл консольный вариант и он рабочий.
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#define ADDR "209.85.229.104"
#define PORT 80
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaDATA;
SOCKET my_socket;
sockaddr_in server_addr;
int len_client_sock;
printf("Scanner address: %s!\n", ADDR);
if(WSAStartup(MAKEWORD(2,2), &wsaDATA) != NO_ERROR){
printf("Library WinSock not load!\n");
WSACleanup();
system("PAUSE");
return 1;
}
else
printf("Library WinSock load!");
my_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ADDR);
server_addr.sin_port = htons(PORT);
len_client_sock = sizeof(server_addr);
if(connect(my_socket, (sockaddr*)&server_addr, len_client_sock) != SOCKET_ERROR)
printf("\nInternet YES!\n");
else
printf("\nInternet NO!\n");
shutdown(my_socket, SD_BOTH);
closesocket(my_socket);
WSACleanup();
system("PAUSE");
return 0;
}
catch(EIdSocketError &se){
if(se.LastError == 11004)
MessageBox(0, "Соединение не обнаружено", 0, 0);
}
Консольный вариант выполняет тоже самое, что:
var
connected: boolean;
begin
connected:=true;
//тут прописываем настройки idHTTP
try
idHTTP.Get('http://www.google.ru');
//в OnStatus можно прописать дисконнект на статусе "Connected", что б лишнего не качать
except
on e: exception do connected := false;
end;
if not connected then
ShowMessage('Нет инета')
else
ShowMessage('Есть инет');
end;
Только на низком уровне.
[hr]
ganselo, я придумал так, как вы показали и как есть на дельфи в коде выше. :)
// Инициализируем массив вне отдельного потока-----------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
lHash = new TStringList;
lHash->Add("564dfacf47f4d215b76a5eb3770a83d4");
lHash->Add("0045BCBD3047391E47F3B56DC7C7F2F2");
lHash->Add("00636A27AF20104CC13E8DDE7DEE64E7");
lHash->Add("012995DAD105ACEFBF05591271CD2F54");
}
//добавляем новую функцию. Здесь и будет обращение к серверу
DWORD WINAPI QueryThread(LPVOID lpParam)
{
TStringList *post = new TStringList;
TStringStream *response = new TStringStream("");
TStringList *lHash = (TStringList *)lpParam;
for(int i = 0; i < lHash->Count; i++){
post->Clear();
post->Add("chain=" + lHash->Strings[i]);
try{
Form1->HTTPQuery->Post("http://www.virustotal.com/search.html", post, response);
}
catch(EIdHTTPProtocolException &se){
switch(se.ErrorCode){
case 200: //всё ок
break;
case 303:
break; //редирект
case 404: //404 not found
break;
default:
break;
}
}
catch(EIdSocketError &se){
MessageBox(0, se.Message.c_str(), 0, 0);
}
Form1->HTTPQuery->Disconnect();
}
delete post, response, lHash;
}
// Выполнение и обработка-------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool connect = true; // Добавил переменную bool
try{
HTTPQuery->Get("http://www.virustotal.com/search.html");
}
catch(EIdHTTPProtocolException &se){
switch(se.ErrorCode){
case 200: //всё ок
break;
case 303:
break; //редирект
case 404: //404 not found
break;
default:
break;
}
}
catch(EIdSocketError &se){
//если не удалось подключится, то возникнет это исключение
// и bool присваивается false
if(se.LastError == 11001)
connect = false;
}
if(connect){ // Если соединение есть - connect == true, начинаем обработку
HANDLE hThread;
hThread = CreateThread(0, 0, QueryThread, lHash, 0, 0);
if(hThread == INVALID_HANDLE_VALUE){
ShowMessage("Can't create thread");
return;
}
CloseHandle(hThread);
}
else // Если соединения нету - connect == false
MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
}
//---------------------------------------------------------------------------
Если где-то что-то я неправильно сделал, лишнее что-то и т.п., поправьте если сможете. Но всё работает. :yes: :up:
if(se.LastError == 11004) »А у меня ошибка 11001 при отсутствии соединения
Socket Error # 11001 Host not found.
Можно было обойтись без лишних проверок, а сделать так:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try{
HTTPQuery->Get("http://www.virustotal.com/search.html");
HANDLE hThread;
hThread = CreateThread(0, 0, QueryThread, lHash, 0, 0);
if(hThread == INVALID_HANDLE_VALUE){
ShowMessage("Can't create thread");
return;
}
CloseHandle(hThread);
}
catch(EIdHTTPProtocolException &se){
switch(se.ErrorCode){
case 200: //всё ок
break;
case 303:
break; //редирект
case 404: //404 not found
break;
default:
break;
}
}
catch(EIdSocketError &se){
if(se.LastError == 11001)
MessageBox(0, "Не удалось подключится к удалённому серверу", 0, MB_OK + MB_ICONWARNING);
}
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.