Что нового

[Сеть, интернет] Проверить доступность хоста из файла и записать в новый файл

bobuni

Новичок
Сообщения
9
Репутация
0
Помогите, ничего не получается, нужен скрипт который проверит каждый "хост" (ip, web-сайт) на доступность и запишет результат в новый файл.
Пока осилил с помощью гугла вот это
Код:
#include <file.au3>

$sFilePath = @ScriptDir & "\ip.txt"
;~ в файле ip.txt указано множество адресов сайтов (каждый с новой строки)
$sLines = _FileCountLines($sFilePath)
For $i = 1 To $sLines
    $command = FileReadLine($sFilePath, $i)
    MsgBox(0, "", $command & $i)
Next

#include <Inet.au3>

$URL = $i

If NOT(_INetGetSource($URL) = "") Then
;~     если доступен то записать с новой строки URL в файл open.txt
Else
;~     если не доступен ничего делать не нужно, проверять следующий хост из файла ip.txt
 EndIf
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Ошибка в коде.
Во-первых, зачем присваивать $URL значение $i? Там же будет находиться только цифра с номером последней строки, а Вам надо получить целую строку.
Во вторых, как Вы собирались работать, если в файле окажется больше одного адреса? Во второй половине программы нет цикла, чтобы опросить все сайты.
Предлагаю сделать так:

Код:
#include <Inet.au3>

$sFileHandle = FileOpen(@ScriptDir & "\ip.txt", 0)
;~ в файле ip.txt указано множество адресов сайтов (каждый с новой строки)
$array_IP = StringSplit(FileRead($sFileHandle), @CRLF)
FileClose($sFileHandle)

$sOpenHandle = FileOpen("Open.txt", 1)
For $i = 1 to $array_IP[0]
  If NOT(_INetGetSource($array_IP[$i]) = "") Then FileWrite($sOpenHandle, $array_IP[$i] & " доступен." & @CRLF)
Next
FileClose($sOpenHandle)
 
Автор
B

bobuni

Новичок
Сообщения
9
Репутация
0
Что-то не хочет работать.
Код:
==> "EndIf" statement with no matching "If" statement.
 
Автор
B

bobuni

Новичок
Сообщения
9
Репутация
0
Извините, опечатался. Цикл For должно закрывать слово Next, а не Endif.
Не, создаётся файл 0 байт.
Во-вторых, маленько не то хотел я в итоге. В Конечный файл должны записаться только доступные (работающие) ИПы, без текста & " доступен."
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Первое. Проверяйте вывод функции _INetGetSource($array_IP[$i]). Точно ли там возвращается пустое место в выводе?
Второе. Что Вам мешает убрать из вывода мешающие Вам текст/символы? Удалите их, да и всего делов.
 
Автор
B

bobuni

Новичок
Сообщения
9
Репутация
0
Я балда, конечно же всё работает, префикс http:// не указан был в исходном файле :smile:
Однако при большом количестве хостов из которых половина недоступна время работы скрипта существенно увеличивается. С помощью "TCPConnect" будет быстрее? Или лучше бросить эту затею средствами autoit?
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
bobuni сказал(а):
С помощью "TCPConnect" будет быстрее? Или лучше бросить эту затею средствами autoit?

Я в своих скриптах сначала проверяю Ping'ом, а потом уже InetGet(...) или, как в Вашем случае, _INetGetSource(...)

Если Ping(...) возвращает 0 или @error, нет смысла подключаться с помощью _INetGetSource(...), можно сразу записать IP в нерабочие.

Добавлено:
Ping - одна из стандартных функций AutoIt, подробнее описано в справке.

Добавлено 2:
Совсем выкидывать _INetGetSource(...) не нужно, потому что в некоторых случаях нам надо получить со страницы данные. Если хост по пингу доступен, а в _INetGetSource(...) выкинет Error 404 или нечто подобное, данных мы не получим.
 
Автор
B

bobuni

Новичок
Сообщения
9
Репутация
0
Не, пинг не устраивает в случае если хост за брандмауэром (заблочены icmp), а порт доступен.
Вообщем вроде накалякал с помощью tcpconnect, вроде даже работает, не уверен по поводу "< @error"
Код:
opt("tcptimeout", 100)
$sfilehandle = fileopen("ip.txt", 0)
$array_ip = stringsplit(fileread($sfilehandle), @crlf)
fileclose($sfilehandle)
$sopenhandle = fileopen("open.txt", 1)

tcpstartup()
for $i = 1 to $array_ip[0]
if not(tcpconnect($array_ip[$i], 21) < @error) then filewrite($sopenhandle, $array_ip[$i] & @crlf)
next
fileclose($sopenhandle)
tcpshutdown()

Смущает только одно, в конце файла добавляется пустая строка :smile: как её убрать?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
bobuni сказал(а):
Смущает только одно, в конце файла добавляется пустая строка :smile: как её убрать?
А чем это мешает? Наоборот удобно.
Мне кажется, что лучше этого не делать...
Наоборот лишние трудности:
* после окончания записи в файл надо будет проверить CRLF и если он есть - убрать,
* перед тем, как добавить в конец файла новые данные, опять же надо будет делать проверку, есть ли CRLF или нет, иначе текст последней строки и добавляемой сольются в одну строку...
 
Верх