## Tcl9.0.3/Tk9.0.3 Documentation > Tcl Commands > socket

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    socket — 電網接続を開く Open a TCP network connection
  構文 SYNOPSIS
  説明 DESCRIPTION
  依頼者側の受け口 　CLIENT SOCKETS
    -myaddr addr
    -myport port
    -async
  中央集中処理装置側の受け口 　SERVER SOCKETS
    -myaddr addr
    -reuseaddr boolean
    -reuseport boolean
  構成設定指示項目　　CONFIGURATION OPTIONS
    -error
    -sockname
    -peername
    -connecting
    -keepalive
    -nodelay
  用例 　EXAMPLES
  SEE ALSO
  KEYWORDS

### NAME

socket — 電網接続を開く Open a TCP network connection

### 構文 SYNOPSIS

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

### 説明 DESCRIPTION

この命令は電網受け口を開け､将来 read や puts や flush のような命令の起動に使用できる通信路識別子を返す｡現状では Pv4 と IPv6 に亙った TCP 電網通信規格のみが運用されている; 将来の版ではその他の通信規格の運用も含むであろう｡この socket 命令は､ -server 切替子がどちらに設定されているかによって､利用依頼者側からも､中央集中処理者側からも開いて使用できる｡[訳註 受け口 socket はIP番地とPort 番号の対｡] This command opens a network socket and returns a channel identifier that may be used in future invocations of commands like read, puts and flush. At present only the TCP network protocol is supported over IPv4 and IPv6; future releases may include support for additional protocols. The socket command may be used to open either the client or server side of a connection, depending on whether the -server switch is specified.

註意すべきは､全ての受け口に対する省略時設定の文字符号体系は､encoding system 命令の返り値に従って､OSの文字符号体系である｡これを何か別の文字符号系に､譬えば utf-8 (他のTcl 課程手順との情報交換には理想的)又は､ iso8859-1 (多くの電網送受規則に､特に古いものに便利)等に変更するには､多くの場合､ chan configure 命令を使う必要があろう｡ 　　　 Note that the default encoding for all sockets is the system encoding, as returned by encoding system. Most of the time, you will need to use chan configure to alter this to something else, such as utf-8 (ideal for communicating with other Tcl processes) or iso8859-1 (useful for many network protocols, especially the older ones).

### 依頼者側の受け口 　CLIENT SOCKETS

もし､ -server 指示項目が指定されていない場合､利用依頼者側からの接続が開かれ､この命令は､読込み､書き出しの両方に使用可能な通信路識別子を返す｡port と host は接続すべき port 番号を指定する; この port 番号の接続を受付ける中央集中処理装置がなければならない｡ port は整数のport番号(又はホストのOSによって運用され､理解されている役務名)､ host は www.tcl.tk のような登録群式名か､ 127.0.0.1 か 2001:DB8::1 のような数による IPv4 や IPv6 番地のどちらかである｡この命令が起動されているホストを参照するには localhost を使用されたい｡　　 If the -server option is not specified, then the client side of a connection is opened and the command returns a channel identifier that can be used for both reading and writing. Port and host specify a port to connect to; there must be a server accepting connections on this port. Port is an integer port number (or service name, where supported and understood by the host operating system) and host is either a domain-style name such as www.tcl.tk or a numerical IPv4 or IPv6 address such as 127.0.0.1 or 2001:DB8::1. Use localhost to refer to the host on which the command is invoked.

接続に関する追加的情報を指定するために､次の様な指示項目が host の前に現れるかもしれない: The following options may also be present before host to specify additional information about the connection:

-myaddr addr
  addr は､接続に使用する利用依頼者側の電網対話機能の､登録群式名か数による IP 番地を与える｡この指示項目は､利用依頼者側の装置が多重の電網対話機能を有している場合に便利である｡この指示項目が省略されると､利用依頼者側の対話機能は系の算譜によって撰ばれることになる｡ Addr gives the domain-style name or numerical IP address of the client-side network interface to use for the connection. This option may be useful if the client machine has multiple network interfaces. If the option is omitted then the client-side interface will be chosen by the system software.

-myport port
  port は､利用依頼者側の為の接続に使う為の整数の port 番号(又はホストのOSによって運用され､理解されている役務名)を指し示す｡もし､この指示項目が省略されると､利用依頼者側の port 番号が系算譜によって無作為に選ばれる｡ Port specifies an integer port number (or service name, where supported and understood by the host operating system) to use for the client's side of the connection. If this option is omitted, the client's port number will be chosen at random by the system software.

-async
  この指示項目は､利用依頼者側の受け口に非同期的な接続を引起す｡これは､受け口はすぐさま生成されるが､制御が socket に返っても中央集中処理にまだ接続されないかもしれないことを意味する｡ 　　　 This option will cause the client socket to be connected asynchronously. This means that the socket will be created immediately but may not yet be connected to the server, when the call to socket returns.

  接続の試みが成功するか､失敗する前に､受け口で gets 又は flush が行われると､もし受け口が同期方式であると､接続が完成するか失敗するまで､操作が待たされる｡もし､受け口が非同期方式で､接続の試みが成功するか､失敗するかの前に､受け口で gets 又は flush が行われると､制御が直に返り､受け口上で fblocked は１を返す｡同期方式の利用依頼者側の受け口は(接続した後に)､非同期方式を使用する操作に切替えられても好い : 　　　　　 When a gets or flush is done on the socket before the connection attempt succeeds or fails, if the socket is in blocking mode, the operation will wait until the connection is completed or fails. If the socket is in nonblocking mode and a gets or flush is done on the socket before the connection attempt succeeds or fails, the operation returns immediately and fblocked on the socket returns 1. Synchronous client sockets may be switched (after they have connected) to operating in asynchronous mode using:

      chan configure chan -blocking 0

  更なる詳細は chan configure 命令を参照されたい｡ See the chan configure command for more details.

  非同期接続が処理されている間 Tcl 行事繰返しは実行すべきである､理由は背景処理の中で幾つかの接続の試みをする必要があり得るので｡行事繰返しの実行は､又､非同期接続が成功したか失敗した時に通知を得る為に､受け口上に書き込み可能な通信路の行事を設定することを可能にする｡行事繰返しと通信路行事の更なる詳細については vwait と chan 命令を参照されたい｡ 　　　　 The Tcl event loop should be running while an asynchronous connection is in progress, because it may have to do several connection attempts in the background. Running the event loop also allows you to set up a writable channel event on the socket to get notified when the asynchronous connection has succeeded or failed. See the vwait and the chan commands for more details on the event loop and channel events.

  指定は接続が依然としてなされているかの確認に使用できる｡接続が成功していることを確認する為に､ -connecting が 0 を返した時に -error 指定が確認されるかもしれない｡　　　 The chan configure option -connecting may be used to check if the connect is still running. To verify a successful connect, the option -error may be checked when -connecting returned 0.

  待ち行列なしの操作は､chan configure の呼出しの瞬間に､内部状態装置を進めることを要求する｡ Operation without the event queue requires at the moment calls to chan configure to advance the internal state machine.

### 中央集中処理装置側の受け口 　SERVER SOCKETS

もし､ -server 指示項目が指定された場合､新しい受け口が､与えられた port (数字でも､ホストのOSによって運用され､理解された役務名でもよい; もし､ port が零であると､OSが､定まっていない port 番号を中央集中処理装置に割当てることになり､それは､ chan configure を使って -sockname 指示項目を読込むと見付けられる)を聞く中央集中処理機能になる｡もしホストが IPv4 と IPv6 の両方を運用している場合､受け口は両方の番地の群を聴くことになる｡Tcl は与えられた port 番号への接続を自動的に受入れる｡それぞれの接続に対し､ Tcl は利用依頼者側との情報交換に使用できる新しい通信路を生成する｡次にTcl は三つの追加的引数を伴い command を起動する(厳密には命令前置辞のリスト､下の EXAMPLES を参照されたい): 三つとは､新しい通信路の名前､電網番地記法による利用依頼者のホストの番地､利用依頼者の port 番号である｡ 　 　　　 If the -server option is specified then the new socket will be a server that listens on the given port (either an integer or a service name, where supported and understood by the host operating system; if port is zero, the operating system will allocate a free port to the server socket which may be discovered by using chan configure to read the -sockname option). If the host supports both, IPv4 and IPv6, the socket will listen on both address families. Tcl will automatically accept connections to the given port. For each connection Tcl will create a new channel that may be used to communicate with the client. Tcl then invokes command (properly a command prefix list, see the EXAMPLES below) with three additional arguments: the name of the new channel, the address, in network address notation, of the client's host, and the client's port number.

次の追加的な､指示項目が送受信用算譜番号の前に指定されるかもしれない: The following additional option may also be specified before port:

-myaddr addr
  addr は､接続に使用する中央集中処理装置側の電網対話機能の､登録群式名か数による IP 番地を与える｡この指示項目は､中央集中処理装置の装置が多数の電網接続を有している場合に便利である｡この指示項目が省略されると､中央集中処理装置の受け口が万能の番地に結ばれ､如何なる対話機構からの接続も受入れられる｡もし addr が個別の装置で利用できる多重 IP 番地を決定できる領域の名前である場合､受け口はその全てを聴くことになる｡ Addr gives the domain-style name or numerical IP address of the server-side network interface to use for the connection. This option may be useful if the server machine has multiple network interfaces. If the option is omitted then the server socket is bound to the wildcard address so that it can accept connections from any interface. If addr is a domain name that resolves to multiple IP addresses that are available on the local machine, the socket will listen on all of them.

-reuseaddr boolean
  もし､そこで活動して聴いている受け口が無い場合は､局所番地を再使用するか否かを､ ＯＳの核に告げる｡Windowsでは､これが無為設定である｡ Tells the kernel whether to reuse the local address if there is no socket actively listening on it. This is the default on Windows.

-reuseport boolean
  同じ番地と接続口に多数の受け口を接続する事を許容するか否かを､ ＯＳの核に告げる｡ Tells the kernel whether to allow the binding of multiple sockets to the same address and port.

中央集中処理装置の通信路は入力や出力には使用できない; 新しい利用依頼者の接続を受入れることだけがその用途である｡入場するそれぞれの利用依頼者の接続の為に生成された通信路は入力と出力用に開かれる｡中央集中処理装置の通信路の閉鎖は中央集中処理装置の操業を停止するので､新しい接続は受入れられなくなる; しかし､既存の接続は影響を受けない｡ Server channels cannot be used for input or output; their sole use is to accept new client connections. The channels created for each incoming client connection are opened for input and output. Closing the server channel shuts down the server so that no new connections will be accepted; however, existing connections will be unaffected.

中央集中処理装置の受け口にとって､何時新しい接続が開かれたかを発見することは､Tcl 行事の仕組みに依存する｡もし､譬えば､ vwait 命令の起動や､Ｃ言語手続函数の Tcl_DoOneEvent を呼ぶなどして､応用譜が行事待ち繰返しに入らないと､接続は全く受入れられなくなる｡ Server sockets depend on the Tcl event mechanism to find out when new connections are opened. If the application does not enter the event loop, for example by invoking the vwait command or calling the C procedure Tcl_DoOneEvent, then no connections will be accepted.

もし､ port が零を指定されていると､OSは未使用の port 番号を中央集中処理装置の受け口のとして使用する様に割り当てる｡下に記述された様に取出す為の -sockname 指示項目を chan configure 命令に使用して､生成された中央集中処理装置の受け口から実際に割当てられた port 番号を取出すことができる｡ 　　　 If port is specified as zero, the operating system will allocate an unused port for use as a server socket. The port number actually allocated may be retrieved from the created server socket using the chan configure command to retrieve the -sockname option as described below.

### 構成設定指示項目　　CONFIGURATION OPTIONS

chan configure 命令は受け口通信路の為の幾つかの読出し専用構成設定指示項目の問合せや､ 幾つかの場合には､受け口通信路上で代りの特性を設定すること､ に利用することができる: 　　　 The chan configure command can be used to query several readonly configuration options for socket channels or in some cases to set alternative properties on socket channels:

-error
  この指示項目は与えられた受け口の現在の不都合状態を取得する｡もし､非同期接続操作が続いているか否かを確定する必要があるときには便利である｡もし､不都合があると不都合伝言文が返される｡もし､不都合がないと空文字列が返される｡ 　　　　 This option gets the current error status of the given socket. This is useful when you need to determine if an asynchronous connect operation succeeded. If there was an error, the error message is returned. If there was no error, an empty string is returned.

  註意すべきことは､不都合宣言は読出し操作により刷新される; これは基礎になっている getsockopt(SO_ERROR) 呼出しを模擬する｡ Note that the error status is reset by the read operation; this mimics the underlying getsockopt(SO_ERROR) call.

-sockname
  この指定項目は､依頼側の受け口(中央集中処理装置の受け口に依頼者が接続する時に作成された通信路を含む)の為に次の三つの要素のリストを返す､番地､主人の名前､ port 番号｡もし主人の名前が算出できない場合は第２の要素は､番地に等しく､リストの第１の要素になる｡ 　　　　 For client sockets (including the channels that get created when a client connects to a server socket) this option returns a list of three elements, the address, the host name and the port number for the socket. If the host name cannot be computed, the second element is identical to the address, the first element of the list.

  この指示項目は､中央集中処理装置の受け口には､上で記述したのと同じ意味を有する三つの要素の群が多重になったリストを返す｡中央集中処理装置の受け口が -myaddr なしで生成されたか､又は､起動しているホストに局所的な多重 IP 番地を決定できる登録名である -myaddr への引数を伴って作成された時､そのリストは複数の群から構成される｡　　　　　 For server sockets this option returns a list of a multiple of three elements each group of which have the same meaning as described above. The list contains more than one group when the server socket was created without -myaddr or with the argument to -myaddr being a domain name that resolves multiple IP addresses that are local to the invoking host.

-peername
  この指示項目は中央集中処理装置の受け口では対応していない｡利用依頼者と､受入れられた受け口には､この指示項目は三つの要素のリストを返す; 番地､ホストの名前､同等な受け口が接続又は束縛されている port 番号である｡もし主人の名前が算出できない場合は第２の要素は､番地に等しく､リストの第１の要素になる｡ 　　　　 This option is not supported by server sockets. For client and accepted sockets, this option returns a list of three elements; these are the address, the host name and the port to which the peer socket is connected or bound. If the host name cannot be computed, the second element of the list is identical to the address, its first element.

-connecting
  この指示項目は､幾つかの受け口では､対応してない｡ 依頼者の受け口に関して､この指示項目は､ 同期接続が猶進行中であれば､1を返し､それ以外は0を返す｡ This option is not supported by server sockets. For client sockets, this option returns 1 if an asynchronous connect is still in progress, 0 otherwise.

-keepalive
  この指示項目は､ 受け口上の TCP 有効接続の指示項目を設定したり､問合せしたりし､ もし､有効接続が接なら1を､それ以外は0を返す｡ This option sets or queries the TCP keepalive option on the socket as 1 if keepalive is turned on, 0 otherwise.

-nodelay
  この指示項目は､ 受け口上の TCP 遅延なし指示項目の設定か問合せとして､もし遅延なしを是に切替えると1､それ以外は 0 ｡ 　　 This option sets or queries the TCP nodelay option on the socket as 1 if nodelay is turned on, 0 otherwise.

### 用例 　EXAMPLES

これは､単純な時刻の中央集中処理装置である: Here is a very simple time server:

    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

これは､中央集中処理装置に通信して何らかの情報を引出す利用依頼者に相当している: And here is the corresponding client to talk to the server and extract some information:

    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"

### SEE ALSO

chan, flush, open, read

### KEYWORDS

asynchronous I/O, bind, channel, connection, domain name, host, network address, socket, tcp
Copyright © 1996 Sun Microsystems, Inc.
Copyright © 1998-1999 Scriptics Corporation.