Sockets в программах на JScript(VBScript)

Дополнительный хост скриптов позволяет использовать функциональность Windows Sockets :

Пример сервера, прослушивающего порт 9000 (порт должен быть открыт:  в XP смотри файл {win}\system32\drivers\etc\services) :
// File: server.w_js
   AF_INET     =   2               /* internetwork: UDP, TCP, etc. */
   SOCK_STREAM = 1

// The code JScript
var flag = new Array();
var my_host = TCPIP.gethostname();
var sock_id = 100;

flag.push(TCPIP.WSAStartup(2,0)); //major=2, minor=0
flag.push(TCPIP.socket(sock_id, AF_INET, SOCK_STREAM, 0));
flag.push(TCPIP.fill_addr(sock_id, my_host, "9000"));
flag.push(TCPIP.bind(sock_id));
flag.push(TCPIP.listen(sock_id, 1024));
flag.push(TCPIP.acceptThread(sock_id));

for (var i=0; i<flag.length; i++)
      Window.TextOut(1, 50, 30 + 20*i, i + ": " + flag[i]);

var text = "";
function EventByteRecv(id, byte)
{ text = text +  String.fromCharCode(byte);
};

function EventEndAcceptThread(id)
{  Window.Delete(2);
   Window.TextOut(2, 70, 150, "Recv: " + text);
   Window.UpdateWindow();
   TCPIP.acceptThread(sock_id); // new accept
   text = "";
};
Пример клиента, засылающего данные в порт 9000:
File: client.w_js
     AF_INET     =   2               /* internetwork: UDP, TCP, etc. */
     SOCK_STREAM = 1

// The code JScript
var flag = new Array();
var my_host = TCPIP.gethostname();
var sock_id = 100;

flag.push(TCPIP.WSAStartup(2,0));  //major=2, minor=0 Winsock 2.0
flag.push(TCPIP.socket(sock_id, AF_INET, SOCK_STREAM, 0));
flag.push(TCPIP.fill_addr(sock_id, my_host, "9000"));
flag.push(TCPIP.connect(sock_id));
flag.push(TCPIP.send(sock_id, "Hello World!"));
//flag.push(TCPIP.fsend(sock_id, "d:\\bin.txt"));
flag.push(TCPIP.closesocket(sock_id));


for (var i=0; i<flag.length; i++)
      Window.TextOut(1, 50, 30 + 20*i, i + ": " + flag[i]);

Обеспечивается доступ к следующим функциям Winsock

WSAStartup(major, minor)
Инициализация Windows Sockets DLL из скрипта. Ее нужно обязательно выполнить перед использованием  сокетов. Можно попросить конкретную версию.
Return value:  boolean.
socket(id, family, type, protocol)
Создать сокет.  
  • id - Номер (целое число), идентифицирующее сокет на уровне скрипта
  • family - Целое число ("фамилия" сокета):
    AF_UNSPEC   =   0               /* unspecified */
    AF_UNIX     =   1               /* local to host (pipes, portals) */
    AF_INET     =   2               /* internetwork: UDP, TCP, etc. */
    AF_IMPLINK  =   3               /* arpanet imp addresses */
    AF_PUP      =   4               /* pup protocols: e.g. BSP */
    AF_CHAOS    =   5               /* mit CHAOS protocols */
    AF_IPX      =   6               /* IPX and SPX */
    AF_NS       =   6               /* XEROX NS protocols */
    AF_ISO      =   7               /* ISO protocols */
    AF_OSI      =   AF_ISO          /* OSI is ISO */
    AF_ECMA     =   8               /* european computer manufacturers */
    AF_DATAKIT  =   9               /* datakit protocols */
    AF_CCITT    =   10              /* CCITT protocols, X.25 etc */
    AF_SNA      =   11              /* IBM SNA */
    AF_DECnet   =   12              /* DECnet */
    AF_DLI      =   13              /* Direct data link interface */
    AF_LAT      =   14              /* LAT */
    AF_HYLINK   =   15              /* NSC Hyperchannel */
    AF_APPLETALK=   16              /* AppleTalk */
    AF_NETBIOS  =   17              /* NetBios-style addresses */
    AF_VOICEVIEW=   18              /* VoiceView */
    AF_FIREFOX  =   19              /* FireFox */
    AF_UNKNOWN1 =   20              /* Somebody is using this! */
    AF_BAN      =   21              /* Banyan */
  • type - Тип сокета: 0 - SOCK_DGRAM, 1 - SOCK_STREAM
  • protocol - Используемый протокол. 0 - автоматический выбор.
Return value: boolean
closesocket(id)
Закрыть сокет (id). Возвращает результат попытки 0 - успешно, число - код ошибки.
gethostname()
Строка, указывающая имя хоста (компа), на котором исполняется скрипт.
fill_addr(id, addr, port)
"Умная" функция установки адреса (id). addr = "aa.bb.cc.dd" или имя хоста, port ="number" или имя сервиса name (string).
Return value: boolean
connect(id) Подключиться через сокет.
Return value: integer (error code) Смотри Windows Sockets Error Codes
bind(id) 
Связать сокет.
Return value: integer (error code) Смотри Windows Sockets Error Codes
send(id, string)
Заслать указанную строку в сокет (id).
Return value: integer (error code or byte count)
fsend(id, path_to_file)
Заслать в сокет(id) содержимое файла.
Return value: integer (error code or byte count)
recv(id, size)
Принять данные из сокета, size - размер буфера.
Return value: integer (error code or byte count)
frecv(id, size, path_to_file)
Аналогично, только принятые данные сразу записваются в файл.
Return value: integer (error code or byte count)
listen(id, backlog)
Настроить очердь приема данных
Return value: integer (error code) Смотри Windows Sockets Error Codes
acceptThread(id)
Создает "серверный поток" для заданного сокета. Функции обратного вызова, которые Вы можете определить в своем скрипте будут вызваны этим потоком по приему данных и по завершению потока:  EventByteRecv(id, byte)  и EventEndAcceptThread(id). Смотри пример.
содержание
Дополнительный хост скриптов
JScript and VBScript are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.