1

Тема: 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>

2

Re: HTA: OstroSoft Winsock Component

Нашел таки (тут же на форуме) как еще можно задавать обработчики эвентов:

function oWinsock::OnConnect() {...}

Так что вопрос - снят. В сканнер добавлю "рюшечек" и, вероятно, включу в пакет LAN Administrator.

3

Re: HTA: OstroSoft Winsock Component

mozers, а в Коллекцию можете добавить про этот компонент?

4

Re: HTA: OstroSoft Winsock Component

2alexii
Хорошо, добавлю. Только вначале давайте опробуем, покритикуем...
Взаимодействие получается низкоуровневое => надо знать особенности протоколов. Например, у меня навскидку не получилось подключится по telnet к принтеру. Посылаю туда "/\r\n", а он, вместо перечня текущих установок, возвращает лишь пару нечитабельных символов

5

Re: HTA: OstroSoft Winsock Component

Изучите и используйте WSO http://www.veretennikov.org/WSO/.
С помощью объекта  COMEvents http://www.veretennikov.org/WSO/Help/ht … ents.html
можно подписываться на асинхронные события почти любых activex-компонентов (которые реализуют "connection point").

6

Re: HTA: OstroSoft Winsock Component

2max7
WSO - штука, конечно, хорошая. Но, убей меня - не пойму зачем мне тащить еще эту, достаточно "тяжелую" библиотеку, когда все и без нее прекрасно работает?
Лучше уж использовать WSO там, где без нее не обойтись.

Кстати, мне всегда казалось весьма странным что при серьезной популярности этой библиотеки в сети практически отсутсвуют полноценные проекты ее использующие

7

Re: HTA: OstroSoft Winsock Component

Так и не дождавшись бурного обсуждения опубликовал примеры в Коллекции

8

Re: HTA: OstroSoft Winsock Component

mozers, спасибо!

9

Re: HTA: OstroSoft Winsock Component

Исправьте, пожалуйста, ссылку на http://www.ostrosoft.com/oswinsck.aspx.

Забыл пароль и потерял e-mail.