# socket

Команда открывает сетевое TCP-соединение.

## СИНТАКСИС

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

## ОПИСАНИЕ

Эта команда открывает сетевое соединение и возвращает идентификатор канала, который может использоваться в последующих командах read, puts или flush. В настоящее время поддерживается только протокол TCP. Команда может использоваться для открытия соединения как со стороны сервера, так и со стороны клиента.

### КЛИЕНТСКОЕ СОЕДИНЕНИЕ

Если опция -server не указана, то канал открывается со стороны клиента, и возвращаемый идентификатор канала может быть использован для операции чтения и записи. Аргументы port и host задают порт для соединения. По данному порту должен быть сервер, обслуживающий соединение. Аргумент port должен быть целым числом, а host - адресом машины в доменном стиле (например, www.sunlabs.com) или числовым IP-адресом (например, 127.0.0.1). Для ссылки на локальную машину, на которой выполняется команда, можно использовать значение localhost.

Для задания дополнительной информации о соединении можно использовать следующие опции.

-myaddr addr
  Аргумент addr задает доменный или числовой адрес сетевого интерфейса клиентской стороны для упрощения соединения. Эта опция может быть полезна, если на клиентской машине есть несколько сетевых интерфейсов. Если опция не указана, системный интерфейс будет выбран операционной системой.
-myport port
  Аргумент port задает номер порта для клиентской стороны соединения. Если опция не указана, номер порта для клиента будет определен операционной системой.
-async
  Использование опции -async приведет к тому, что клиент будет подсоединен в асинхронном режиме. Это значит, что сокет будет создан немедленно, возможно, еще до установления связи с сервером. Если канал открыт в блокирующем режиме, то при выполнении команды gets или flush по такому сокету, команда завершится только после того, как процесс установления соединения будет завершен. Если канал открыт в неблокирующем режиме, то в этой ситуации команда завершится немедленно, а команда fblocked для данного канала возвратит 1.

### СЕРВЕРНОЕ СОЕДИНЕНИЕ

Если в команде присутствует опция -server, то новый сокет будет сервером для порта port. Tcl будет автоматически устанавливать соединения по данному порту. Для каждого соединения будет создаваться новый канал, который может быть использован для связи с клиентом. При этом Tcl выполняет команду command с тремя дополнительными аргументами: имя нового канала, адрес клиентской машины в сетевой нотации и номер порта клиента.

В команде можно использовать следующие опции:

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

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

Сокет сервера не может обнаружить новое соединение при незапущенном обработчике событий. Поэтому в приложении должен быть запущен обработчик событий, например, командой vwait.

## КОНФИГУРАЦИОННЫЕ ОПЦИИ

Команда fconfigure может получить значения нескольких неизменяемых опций для сокетов:

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