Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2016, 01:11   #1
Mr.gretty
Новичок
Джуниор
 
Регистрация: 14.11.2016
Сообщений: 2
По умолчанию Проверка доступности URL (masm)

Ув. программисты, помогите пожалуйста написать программу на ассемблере : проверка доступности url сайта или дайте пожалуйста ссылки на ресурсы где можно было бы разобраться с этой задачей.
Нигде не могу найти информацию
Mr.gretty вне форума Ответить с цитированием
Старый 14.11.2016, 04:36   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Mr.gretty,
а как бы ты это задание сделал на любом известном тебе языке? Напиши фрагмент на Си/Паскале/Бейсике, а на ассемблер переведем.
Mikl___ вне форума Ответить с цитированием
Старый 14.11.2016, 12:25   #3
Mr.gretty
Новичок
Джуниор
 
Регистрация: 14.11.2016
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
Mr.gretty,
а как бы ты это задание сделал на любом известном тебе языке? Напиши фрагмент на Си/Паскале/Бейсике, а на ассемблер переведем.
Реализация на Java:

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 он не работает, да и особо не понятно что он тут происходит.
Mr.gretty вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мультипотоковая проверка доступности порта 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