Spec-Zone.ru › Tcl/Tk

socket

Имя
socket — Открытие TCP-соединения
Синтаксис
Описание
Клиентские сокеты
-myaddr addr
-myport port
-async
Серверные сокеты
-myaddr addr
Параметры конфигурации
-error
-sockname
-peername
-connecting
Примеры
История
См. также
Ключевые слова

Имя

socket — Открытие TCP-соединения

Синтаксис

socket ?options? host port
socket -server command ?options? port

Описание

Эта команда открывает сетевой сокет и возвращает идентификатор канала, который может быть использован в последующих вызовах команд, таких как read, puts и flush. В настоящее время поддерживается только TCP-сетевой протокол через IPv4 и IPv6; будущие версии могут включать поддержку дополнительных протоколов. Команда socket может использоваться для открытия клиентской или серверной стороны соединения, в зависимости от того, указан ли переключатель -server.

Обратите внимание, что по умолчанию кодировка всех сокетов — это кодировка системы, возвращаемая командой encoding system. Чаще всего вам потребуется использовать chan configure для изменения её на что-то другое, например, utf-8 (идеально для общения с другими процессами Tcl) или iso8859-1 (полезно для многих сетевых протоколов, особенно более старых).

Клиентские сокеты

Если параметр -server не указан, то открывается клиентская сторона соединения, и команда возвращает идентификатор канала, который может использоваться для чтения и записи. Port и host указывают порт для подключения; на этом порту должен быть сервер, принимающий подключения. Port — это целочисленный номер порта (или имя службы, если поддерживается и распознаётся операционной системой хоста), а host — это либо имя домена, например, www.tcl.tk, либо числовой IPv4 или IPv6 адрес, например, 127.0.0.1 или 2001:DB8::1. Используйте localhost для ссылки на хост, на котором вызывается команда.

Перед host могут быть указаны следующие параметры для предоставления дополнительной информации о соединении:

-myaddr addr
Addr задаёт имя домена или числовой IP-адрес сетевого интерфейса клиентской стороны для использования в соединении. Этот параметр может быть полезен, если у клиентской машины несколько сетевых интерфейсов. Если этот параметр опущен, то клиентский интерфейс будет выбран программным обеспечением системы.
-myport port
Port задаёт целочисленный номер порта (или имя службы, если поддерживается и распознаётся операционной системой хоста) для использования на клиентской стороне соединения. Если этот параметр опущен, номер порта клиента будет выбран случайным образом программным обеспечением системы.
-async
Этот параметр заставит клиентский сокет подключаться асинхронно. Это означает, что сокет будет создан немедленно, но может ещё не быть подключён к серверу, когда вызов socket вернётся.

Когда выполняется gets или flush для сокета до успешного или неудачного подключения, если сокет находится в блокирующем режиме, операция будет ждать завершения или неудачи подключения. Если сокет находится в режиме без блокировки, а gets или flush выполняются для сокета до успешного или неудачного подключения, операция возвращается немедленно, и fblocked для сокета возвращает 1. Синхронные клиентские сокеты могут быть переключены (после подключения) в асинхронный режим с помощью:

chan configure chan -blocking 0

Более подробную информацию см. в команде chan configure.

Цикл событий Tcl должен работать во время асинхронного подключения, поскольку ему может потребоваться выполнить несколько попыток подключения в фоновом режиме. Запуск цикла событий также позволяет настроить событие записи канала на сокете для получения уведомления об успехе или неудаче асинхронного подключения. См. команды vwait и chan для получения дополнительной информации о цикле событий и событиях каналов.

Параметр chan configure -connecting может использоваться для проверки, выполняется ли соединение. Для проверки успешного соединения можно проверить параметр -error, когда -connecting вернул 0.

Операция без очереди событий в настоящее время требует вызовов chan configure для продвижения внутренней машины состояний.

Серверные сокеты

Если указан параметр -server, то новый сокет будет сервером, который прослушивает указанный port (целое число или имя службы, если поддерживается и распознаётся операционной системой хоста; если port равен нулю, операционная система выделит свободный порт для серверного сокета, который можно определить, используя chan configure для чтения параметра -sockname). Если хост поддерживает как IPv4, так и IPv6, сокет будет прослушивать оба семейства адресов. Tcl автоматически будет принимать подключения к указанному порту. Для каждого подключения Tcl создаст новый канал, который можно использовать для связи с клиентом. Затем Tcl вызовет command (правильно — список префиксов команд, см. примеры ниже) с тремя дополнительными аргументами: имя нового канала, адрес клиента в сетевом формате и номер порта клиента.

Перед port можно также указать следующие дополнительные параметры:

-myaddr addr
Addr задаёт имя домена или числовой IP-адрес сетевого интерфейса серверной стороны для использования в соединении. Этот параметр может быть полезен, если у серверной машины несколько сетевых интерфейсов. Если этот параметр опущен, серверный сокет будет связан с универсальным адресом, так что он может принимать подключения с любого интерфейса. Если addr — это имя домена, которое разрешается на несколько IP-адресов, доступных на локальной машине, сокет будет прослушивать все из них.

Серверные каналы не могут использоваться для ввода или вывода; их единственное назначение — принимать новые клиентские подключения. Каналы, созданные для каждого входящего клиентского подключения, открываются для ввода и вывода. Закрытие серверного канала прекращает работу сервера, так что новые подключения не будут приниматься; однако существующие подключения останутся без изменений.

Серверные сокеты зависят от механизма событий Tcl для определения момента открытия новых подключений. Если приложение не входит в цикл событий, например, вызывая команду vwait или вызывая C-процедуру Tcl_DoOneEvent, то подключения не будут приниматься.

Если port задан как ноль, операционная система выделит незанятый порт для использования в качестве серверного сокета. Номер порта, фактически выделенный, можно получить из созданного серверного сокета с помощью команды chan configure для получения параметра -sockname, как описано ниже.

Параметры конфигурации

Команда chan configure может использоваться для запроса нескольких параметров конфигурации только для чтения для каналов сокетов:
-error
Этот параметр получает текущий статус ошибки данного сокета. Это полезно, когда необходимо определить, завершилась ли асинхронная операция подключения успешно. Если произошла ошибка, возвращается сообщение об ошибке. Если ошибки нет, возвращается пустая строка.

Обратите внимание, что статус ошибки сбрасывается операцией чтения; это имитирует вызов getsockopt(SO_ERROR) в нижнем уровне.

-sockname
Для клиентских сокетов (включая каналы, которые создаются при подключении клиента к серверному сокету) этот параметр возвращает список из трёх элементов: адрес, имя хоста и номер порта для сокета. Если имя хоста не может быть вычислено, второй элемент идентичен адресу, первому элементу списка.

Для серверных сокетов этот параметр возвращает список, состоящий из кратного трёх элементов, каждая группа из которых имеет такое же значение, как описано выше. Список содержит более одной группы, если серверный сокет был создан без -myaddr или с аргументом -myaddr, являющимся именем домена, которое разрешается на несколько IP-адресов, которые являются локальными для хоста, вызывающего команду.

-peername
Этот параметр не поддерживается серверными сокетами. Для клиентских и принятых сокетов этот параметр возвращает список из трёх элементов: адрес, имя хоста и порт, к которому подключён или привязан сокет-партнёр. Если имя хоста не может быть вычислено, второй элемент списка идентичен адресу, его первому элементу.
-connecting
Этот параметр не поддерживается серверными сокетами. Для клиентских сокетов этот параметр возвращает 1, если асинхронное подключение всё ещё происходит, и 0 в противном случае.

Примеры

Вот очень простой сервер времени:
proc Server {startTime channel clientaddr clientport} {
    puts "Connection from $clientaddr registered"
    set now [clock seconds]
    puts $channel [clock format $now]
    puts $channel "[expr {$now - $startTime}] since start"
    close $channel
}

socket -server [list Server [clock seconds]] 9900
vwait forever

И вот соответствующий клиент для общения с сервером и извлечения некоторой информации:

set server localhost
set sockChan [socket $server 9900]
gets $sockChan line1
gets $sockChan line2
close $sockChan
puts "The time on $server is $line1"
puts "That is [lindex $line2 0]s since the server started"

История

Поддержка IPv6 была добавлена в Tcl 8.6.

См. также

chan, flush, open, read

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/socket.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/socket.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API