1 (изменено: mozers, 2013-06-19 15:23:09)

Тема: HTA: OstroSoft Winsock Component

"OstroSoft Winsock Component" - ActiveX для работы с Winsock.
Отечественный, бесплатный для использования в некоммерческих приложениях. Небольшого размера. Корректно работает с JavaScript.
По ссылке скачивается zip с документацией и примерами использования на VBS, JS, и других языках.
Программный доступ к Winsock открывает нам широчайшие возможности для построения самых разнообразных приложений использующих протокол TCP/IP.
В примерах приведена процедура загрузки web-страницы по протоколу http. Таким же макаром можно загружать файлы по ftp. Один умелец сочинил web-сервер на JS. Так же можно реализовать Telnet-сервер или клиента. Или, например, сочинить сетевой чат. Все зависит от вашей фантазии.

Пример загрузки 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>
<script type="text/javascript">
    window.resizeTo(280, 380);

    var aPorts = [21,22,23,25,80,110,139,143,445,1433,1521,3306,3389,5631,5900];
    var i = 0;

    function CheckNextPort(){
        if (i < aPorts.length){
            var nPort = aPorts[i];
            Logging(nPort + '\t');
            oWinsock.Connect(idHost.value, nPort);
            i++;
        }
    }

    function Logging(text){
        idLog.insertAdjacentText('BeforeEnd', text);
    }
</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=''; CheckNextPort()" 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>
<object id="oWinsock" style="display:none;" classid="CLSID:37F9EE2B-98A7-49D7-B505-94DFCE7FAC60"></object>
<script type="text/javascript">
    function oWinsock::OnConnect(){
        oWinsock.CloseWinsock();
    }

    function oWinsock::OnError(){
        Logging('CLOSE\n');
        CheckNextPort();
    }

    function oWinsock::OnClose(){
        Logging('OPEN\n');
        CheckNextPort();
    }
</script>
</html>

Обсудить компонент и решения можно тут.