|
Дополнительный хост скриптов
позволяет использовать функциональность 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).
Смотри пример.
содержание
|