socket
-
Имя
- socket — Открытие TCP-соединения
- Синтаксис
- Описание
- Клиентские сокеты
-
-myaddr addr
- -myport port
- -async
- -myport port
- Серверные сокеты
- -myaddr addr
- Параметры конфигурации
- Примеры
- История
- См. также
- Ключевые слова
Имя
socket — Открытие TCP-соединенияСинтаксис
socket ?options? host portsocket -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 может использоваться для запроса нескольких параметров конфигурации только для чтения для каналов сокетов:Примеры
Вот очень простой сервер времени: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