Тема: HTA: OstroSoft Winsock Component
Недавно случайно наткнулся на один интересный ActiveX, называется "OstroSoft Winsock Component".
Разработчик - отечественный, компонент бесплатный для использования в некоммерческих приложениях.
По ссылке скачивается zip с документацией и примерами использования на vbs, js, sql,...
Программный доступ к Winsock открывает нам широчайшие возможности для построения самых разнообразных приложений использующих протокол TCP/IP. В примерах приведена процедура загрузки web-страницы по протоколу http. Таким же макаром можно загружать файлы по ftp. Один умелец сочинил web-сервер на JS. Так же можно реализовать Telnet-сервер или клиента. Или, например, сочинить сетевой чат. Все зависит от вашей фантазии.
Для задания обработчиков прерываний используется следующий трюк:
oWinsock = new ActiveXObject("OSWINSCK.Winsock");
WScript.ConnectObject(oWinsock, "oWinsock_");
function oWinsock_OnConnect() {...};
function oWinsock_OnDataArrival(bytesTotal) {...};
Такой способ не годится для web-приложений, т.к. обращение к WScript с веб-страницы лишено смысла.
Задание обработчика обычным порядком так же не удаётся
oWinsock.OnConnect = function() {...};
Объект полагает что я пытаюсь задать свойство или метод и говорит что такие отсутствуют.
Как таким способом задать обработчик? Я так и не догадался Надеюсь на помощь спецов.
Пока пользуюсь несколько громоздким и, я слышал, "не рекомендованным" методом:
<script for="oWinsock" event="OnConnect()" type="text/javascript">...</script>
Пример загрузки html кода веб-страницы:
<html>
<head>
<meta http-equiv=content-type content="text-html; charset=utf-8">
<meta http-equiv=MSThemeCompatible content=yes>
<hta:application
innerBorder=no
scroll=no
selection=no
contextMenu=no
singleinstance=yes
>
<title>Get Page with OstroSoft Winsock component</title>
<object id="oWinsock" style="display:none;" classid="CLSID:37F9EE2B-98A7-49D7-B505-94DFCE7FAC60"></object>
<script for="oWinsock" event="OnConnect()" type="text/javascript">
oWinsock.SendData('GET /' + sPage + ' HTTP/1.0\r\nHost: ' + sHost + '\r\nAccept: text/html\r\n\r\n');
</script>
<script for="oWinsock" event="OnError(Number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay)" type="text/javascript">
alert(Number + ': ' + Description);
</script>
<script for="oWinsock" event="OnDataArrival(bytesTotal)" type="text/javascript">
idSource.insertAdjacentText('BeforeEnd', oWinsock.GetDataBuffer());
oWinsock.CloseWinsock();
</script>
<script type="text/javascript">
var sPage = '';
var sHost = '';
function Connect(){
idSource.innerText = "";
if (/^(\w+?:\/\/)*([^\/:]+):*(\d*)\/*(.*?)$/.test(idURL.value)) {
sHost = RegExp.$2;
var nPort = RegExp.$3 || 80;
sPage = RegExp.$4;
alert("Host:\t"+sHost+"\nPort:\t"+nPort+"\nPage:\t"+sPage);
oWinsock.Connect(sHost, nPort);
} else {
alert("Invalid URL");
}
}
</script>
</head>
<body style="background-color:threedface;">
<table style="width:100%; height:100%">
<tr>
<td style="width:100%;"><input id="idURL" type="text" value="http://www.ostrosoft.com/oswinsck.asp" style="width:100%;"></td>
<td><input type=button onClick="Connect()" value=GetPage hidefocus></td>
</tr>
<tr style="height:100%">
<td colspan="2"><textarea id="idSource" style="width:100%; height:100%"></textarea></td>
</tr>
</table>
</body>
</html>
Пример сканера открытых портов на локальном или удаленном ПК:
<html>
<head>
<meta http-equiv=content-type content="text-html; charset=utf-8">
<meta http-equiv=MSThemeCompatible content=yes>
<hta:application
innerBorder=no
scroll=no
selection=no
contextMenu=no
singleinstance=yes
>
<title>Ports Scanner</title>
<object id="oWinsock" style="display:none;" classid="CLSID:37F9EE2B-98A7-49D7-B505-94DFCE7FAC60"></object>
<script for="oWinsock" event="OnConnect()" type="text/javascript">
oWinsock.CloseWinsock();
</script>
<script for="oWinsock" event="OnError(Number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay)" type="text/javascript">
Logging('CLOSE\n');
Check();
</script>
<script for="oWinsock" event="OnClose()" type="text/javascript">
var m = new Date();
Logging('OPEN ('+ (m-t) + ' ms)\n');
Check();
</script>
<script type="text/javascript">
var t;
var aPorts = [21,22,23,25,80,110,139,143,445,1433,1521,3306,3389,5631,5900];
var i = 0;
function Check(){
if (i < aPorts.length){
var nPort = aPorts[i];
Logging(nPort + '\t');
t = new Date();
oWinsock.Connect(idHost.value, nPort);
i++;
}
}
function Logging(text){
idLog.insertAdjacentText('BeforeEnd', text);
}
window.resizeTo(280, 380);
</script>
</head>
<body style="background-color:threedface;">
<table style="width:100%; height:100%">
<tr>
<td>Host:</td>
<td style="width:100%;"><input id="idHost" type="text" value="127.0.0.1" style="width:100%;"></td>
<td><input type=button onClick="idLog.innerText=''; Check()" value=CheckPorts hidefocus></td>
</tr>
<tr style="height:100%">
<td colspan="3"><textarea id="idLog" style="width:100%; height:100%"></textarea></td>
</tr>
</table>
</body>
</html>