|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.11.2016, 01:11 | #1 |
Новичок
Джуниор
Регистрация: 14.11.2016
Сообщений: 2
|
Проверка доступности URL (masm)
Ув. программисты, помогите пожалуйста написать программу на ассемблере : проверка доступности url сайта или дайте пожалуйста ссылки на ресурсы где можно было бы разобраться с этой задачей.
Нигде не могу найти информацию |
14.11.2016, 04:36 | #2 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
Mr.gretty,
а как бы ты это задание сделал на любом известном тебе языке? Напиши фрагмент на Си/Паскале/Бейсике, а на ассемблер переведем. |
14.11.2016, 12:25 | #3 | |
Новичок
Джуниор
Регистрация: 14.11.2016
Сообщений: 2
|
Цитата:
import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; try{ URL myURl = new URL("http://google.com"); URLConnection myURLConection= myURl.openConnection(); myURLConection.connect(); System.out.println("Success"); }catch(MalformedURLException e){ System.out.println("New Url Failed"); } catch(IOException e){ System.out.println("Connection Failed"); } Реализация на php ( время выполнение долгое , но это один из вариантов): <?php $url = "http://google.com"; if(@fopen($url,r)){ echo "Success";} else{ echo "Failed";} ?> Реализация на С++ ( нашел на stackoverflow): #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <string.h> #include <winsock2.h> #include <windows.h> #include <iostream> #include <vector> #include <locale> #include <sstream> using namespace std; #pragma comment(lib,"ws2_32.lib") int main(void) { WSADATA wsaData; SOCKET Socket; SOCKADDR_IN SockAddr; int lineCount = 0; int rowCount = 0; struct hostent *host; locale local; char buffer[10000]; int i = 0; int nDataLength; string website_HTML; // website url string url = "www.google.com"; //HTTP GET string get_http = "GET / HTTP/1.1\r\nHost: " + url + "\r\nConnection: close\r\n\r\n"; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { cout << "WSAStartup failed.\n"; system("pause"); //return 1; } Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); host = gethostbyname(url.c_str()); SockAddr.sin_port = htons(80); SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) { cout << "Could not connect"; system("pause"); //return 1; } // send GET / HTTP send(Socket, get_http.c_str(), strlen(get_http.c_str()), 0); // recieve html while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0) { int i = 0; while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { website_HTML += buffer[i]; i += 1; } } closesocket(Socket); WSACleanup(); // Display HTML source cout << website_HTML; // pause cout << "\n\nPress ANY key to close.\n\n"; cin.ignore(); cin.get(); return 0; } Альтернативный вариант С++ с использованием библиотеки Libcurl: CURL* c; c = curl_easy_init(); curl_easy_setopt( c, CURL_URL, "www.google.com" ); curl_easy_perform( c ); curl_easy_cleanup( c ); Код на ассемблере(Если не ошибаюсь, то это FASM), взятый из http://www.manhunter.ru/assembler/10...ssemblere.html ;--------------------------------------------- ; is_valid_url Demo ; Copyright (C) by ManHunter / PCL ; http://www.manhunter.ru ;--------------------------------------------- format PE GUI 4.0 entry start include 'win32a.inc' ;--------------------------------------------- section '.data' data readable writeable url db 'http://lat.mirror.alawar.com/12LaboursofHercules4MotherNatureRus .exe',0 mask db 'Result: %u',0 buff rb 100h ;--------------------------------------------- section '.code' code readable executable start: stdcall is_valid_url,url,TRUE invoke wsprintf,buff,mask,eax add esp,12 invoke MessageBox,0,buff,buff,MB_OK invoke ExitProcess,0 ;---------------------------------------------------------------------- ; Функция для проверки доступности URL ;---------------------------------------------------------------------- ; Параметры: ; lpURL - указатель на строку ASCIIZ проверяемого URL ; dGetSize - сразу запрашивать размер данных (TRUE/FALSE) ; На выходе: ; EAX = -1 - ссылка недоступна или нет соединения ; EAX = 1 - если ссылка доступна и dGetSize = FALSE ; EAX = размер данных, если ссылка доступна и dGetSize = TRUE ;---------------------------------------------------------------------- proc is_valid_url lpURL:DWORD, dGetSize:DWORD INTERNET_OPEN_TYPE_PRECONFIG = 0x00000000 INTERNET_FLAG_NO_UI = 0x00000200 HTTP_QUERY_STATUS_CODE = 0x00000013 HTTP_QUERY_CONTENT_TYPE = 0x00000001 HTTP_QUERY_CONTENT_LENGTH = 0x00000005 HTTP_QUERY_FLAG_NUMBER = 0x20000000 BUFF_LENGTH = 100h locals result dd ? hInet dd ? dummy dd ? buff_len dd ? buff rb BUFF_LENGTH endl ; Сохранить все регистры pusha ; По умолчанию все плохо mov [result],-1 ; Открыть соединение invoke InternetOpen,NULL,INTERNET_OPEN_TYP E_PRECONFIG,NULL,NULL,0 or eax,eax jz .loc_ret ; Положить Handle на стек push eax ; Запросить соединение с URL invoke InternetOpenUrl,eax,[lpURL],NULL,0,INTERNET_FLAG_NO_UI,0 or eax,eax jz .loc_close_hinet mov ebx,eax ; Размер буфера для приема данных mov [buff_len],BUFF_LENGTH ; Получить код состояния HTTP lea eax,[dummy] push eax lea eax,[buff_len] push eax lea eax,[buff] push eax invoke HttpQueryInfo,ebx,HTTP_QUERY_STATUS _CODE+HTTP_QUERY_FLAG_NUMBER or eax,eax jz .loc_close_hconnection ; Код состояния = 200 (OK)? lea eax,[buff] cmp dword [eax],200 jne .loc_close_hconnection ; Надо ли сразу запрашивать размер данных? cmp [dGetSize],TRUE jz @f ; Ссылка просто доступна mov [result],1 jmp .loc_close_hconnection @@: ; Получить размер возвращаемого контента lea eax,[dummy] push eax lea eax,[buff_len] push eax lea eax,[buff] push eax invoke HttpQueryInfo,ebx,HTTP_QUERY_CONTEN T_LENGTH+HTTP_QUERY_FLAG_NUMBER or eax,eax jz .loc_close_hconnection ; Размер контента lea eax,[buff] mov eax,[eax] mov [result],eax .loc_close_hconnection: invoke InternetCloseHandle,ebx .loc_close_hinet: ; Handle на стеке invoke InternetCloseHandle .loc_ret: ; Восстановить все регистры popa ; Вернуть результат в регистре EAX mov eax,[result] ret endp ;--------------------------------------------- section '.idata' import data readable writeable library kernel32,'kernel32.dll',\ user32,'user32.dll',\ shell32,'shell32.dll',\ wininet,'wininet.dll' include 'apia\kernel32.inc' include 'apia\user32.inc' include 'apia\shell32.inc' import wininet,\ InternetOpen,'InternetOpenA',\ InternetOpenUrl,'InternetOpenUrlA', \ HttpQueryInfo,'HttpQueryInfoA',\ InternetCloseHandle,'InternetCloseH andle' P.S под masm он не работает, да и особо не понятно что он тут происходит. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Мультипотоковая проверка доступности порта | igh0st | Работа с сетью в Delphi | 3 | 22.10.2013 13:16 |
Проверка доступности файла | Freezer | Общие вопросы Delphi | 2 | 25.03.2011 10:32 |
Проверка URL на работоспособность | Beni | PHP | 2 | 13.08.2009 21:44 |
Проверка доступности сервера | xmaratx | Работа с сетью в Delphi | 2 | 21.04.2009 16:14 |
Проверка доступности файла | Marsik | Помощь студентам | 2 | 05.04.2008 09:53 |