TCP
- TCP
- socket.tcp()
- server:accept()
- master:bind(address, port)
- master:close()
- client:close()
- server:close()
- master:connect(address, port)
- client:getpeername()
- master:getsockname()
- client:getsockname()
- server:getsockname()
- master:getstats()
- client:getstats()
- server:getstats()
- master:listen(backlog)
- client:receive([pattern [, prefix]])
- client:send(data [, i [, j]])
- client:setoption(option [, value])
- server:setoption(option [, value])
- master:setstats(received, sent, age)
- client:setstats(received, sent, age)
- server:setstats(received, sent, age)
- master:settimeout(value [, mode])
- client:settimeout(value [, mode])
- server:settimeout(value [, mode])
- client:shutdown(mode)
TCP
socket.tcp()
TCPマスターオブジェクトを作成して返します。マスターオブジェクトは(bindの後)listenメソッドでサーバオブジェクトになったり、
connectメソッドでクライアントオブジェクトになったりします。
他にマスターオブジェクトでサポートでされているのはcloseメソッドだけです。
成功した場合、新しいマスターオブジェクトが返されます。
エラーの場合、nilに続いてエラーメッセージが返されます。
server:accept()
サーバオブジェクトでリモートからの接続を待ちます。接続を表すクライアントオブジェクトを返します。正常に接続された場合、クライアントオブジェクトが返されます。
タイムアウトになった場合、nilに続いてエラー文字列'timeout'を返します。
他のエラーが発生した場合、nilに続いてエラーメッセージが返されます。
注意: サーバオブジェクトで、acceptを呼ぶ前にrecvtパラメータを通してsocket.selectを呼んでも、
acceptがすぐに返ってくることは保証されません。settimeoutメソッドを使うか、別のクライアントが接続するまでのブロックを受け入れてください。
master:bind(address, port)
ローカルホストのaddressとportにマスターオブジェクトをbindします。addressはIPアドレスかホスト名を指定します。portは[0..64K]の範囲の整数でなければなりません。
addressが'*'の場合、システムはINADDR_ANY(ワイルドカードアドレス)を使用してすべてのローカルインタフェースにbindします。
portが0の場合、システムは自動的に一時ポートを選択します。
成功した場合、1を返します。
エラーの場合、nilに続いてエラーメッセージを返します。
注意:socket.bind関数も利用でき、これはサーバソケットを作成するためのショートカットになっています。
master:close()
client:close()
server:close()
TCPオブジェクトを閉じます。オブジェクトが内部で使用しているソケットが閉じられ、bindされていたローカルアドレスが他のアプリケーションで
利用可能になります。閉じたソケットではそれ以降の操作ができません(再度closeメソッドを呼ぶことを除いて)。
注意:必要なくなった全てのソケットを閉じることは重要です。多くのシステムではソケットはファイルディスクリプタを
使用しますが、これは限られたシステムリソースです。
ただ、ガーベッジコレクションで回収されるオブジェクトはデストラクタで自動的に閉じられます。
master:connect(address, port)
マスターオブジェクトがリモートホストに接続を試み、クライアントオブジェクトに変化します。クライアントオブジェクトがサポートしているメソッドはsend,receive,getsockname,getpeername,settimeout,closeです。
addressはIPアドレスかホスト名を指定できます。portは[1..64k]の範囲の整数でなければなりません。
成功の場合、1を返します。
失敗の場合、nilに続いてエラーメッセージを返します。
注意:socket.connect関数が利用できますが、これはクライアントソケットを作成するソートカットになっています。
注意:LuaSocket2.0以降、settimeoutメソッドはconnectに対して動作し、タイムアウトが発生するとエラーを返します。
タイムアウト発生時には、まだソケットがsendtテーブルにある状態でsocket.selectを呼ぶことができます。
ソケットは接続が確立したときに書き込み可能になります。
client:getpeername()
接続後のクライアントオブジェクトのリモート側の情報を返します。ピアのIPアドレスを文字列で返し、続いてピアが接続に使用しているポート番号を返します。
エラーの場合、nilを返します。
注意:サーバオブジェクトでこのメソッドを呼んでも意味がありません。
master:getsockname()
client:getsockname()
server:getsockname()
オブジェクトに関連付けられたローカルアドレスの情報を返します。メソッドはローカルIPアドレスの文字列とポート番号を返します。
エラーの場合はnilを返します。
master:getstats()
client:getstats()
server:getstats()
ソケットの情報を返します。これは使用帯域を知るのに役に立ちます。メソッドは受信したbyte数,送信したbyte数,socketオブジェクトが生成されてからの秒数を返します。
master:listen(backlog)
接続を受け付けたいソケットを指定し、オブジェクトをサーバオブジェクトにします。サーバオブジェクトはaccept,getsockname,setoption,settimeout,closeメソッドをサポートしています。
backlogパラメータでサービスにキューイングされて待つことのできるクライアントの接続数を指定します。
キューが一杯の場合、別のクライアントが接続してきても、接続が拒否されます。
成功した場合、1を返します。
エラーの場合、nilに続いてエラーメッセージを返します。
client:receive([pattern [, prefix]])
クライアントオブジェクトから、指定したpatternにしたがってデータを読み取ります。パターンはLuaファイルI/Oフォーマットと同じものです。
すべてのパターンのパフォーマンス上の違いは取るに足らないものです。
patternは以下のようなものになります。
- '*a' : ソケットから接続が閉じるまで読み込みます。行末の変換は行われません。
- '*l' : ソケットからテキストを1行読み込みます。その行はLF文字(ASCIIで10)で終了されています。その前にCR文字(ASCIIで13)があってもかまいません。CRとLF文字は返される1行の中には含まれません。実際、すべてのCR文字はパターンでは無視されます。これはデフォルトのパターンです。
- 数 : ソケットから指定したバイト数だけ読み込みます。
prefixはオプションの文字列で、受信したデータの前に付加されます。
成功した場合、パターンにしたがって受信したデータを返します。
エラーの場合、nilに続いてエラーメッセージを返します。転送が完了する前に接続が閉じられた場合は'closed'、操作中にタイムアウトが発生した場合は'timeout'がエラーメッセージになります。
またエラーメッセージの後に、関数は転送データの部分的な結果を返します。
重要:この関数は大きく変更されました。以前は多くのパターンをサポートしていました(しかし私はその機能が使われているのを見たことは一度もありません)が今は存在しません。
以前は、部分的な結果は成功した場合の結果と同様に返されていました。この最後の機能はエラーのときにnilを返すという全ての関数のルールに反したものでした。
したがってこれも変更されました。
client:send(data [, i [, j]])
クライアントオブジェクトでdataを送信します。dataは送信される文字列です。オプションの引数iとjはLuaの標準ライブラリのstring.sub関数と同様に動作して、部分文字列を送信することができるようになります。
成功した場合、このメソッドは送信された[i,j]のなかの最終バイトのインデックスを返します。iが0もしくは省略された場合、これは送信されたバイト数になります。
エラーの場合、nilに続いてエラーメッセージを返します。続いて、送信された[i,j]のなかの最終バイトのインデックスを返します。
再度、続きからデータを送信することができます。転送が完了する前に接続が閉じられた場合'closed'、操作の途中でタイムアウトが発生した場合は'timeout'の文字列がエラーメッセージとして返されます。
注意:出力はバッファリングされません。小さな文字列を何回も送信するのではなく、Luaで文字列を連結('..'で)してから一度に送信する方が良い方法になります。
client:setoption(option [, value])
server:setoption(option [, value])
TCPオブジェクトにオプションを設定します。オプションは低レベルやタイムクリティカルなアプリケーションでのみ必要とされます。本当に必要な場合のみオプションを変更すべきです。
optionはオプション名の文字列です。valueはオプションによって指定するものが変わります。
- 'keepalive' : このオプションをtrueに設定すると、接続したソケットで周期的にメッセージの転送が行われます。接続状態でメッセージの応答がない場合、接続が壊れたと判断してソケットに通知します。
- 'linger' : 未送信のデータがソケットのキューに存在する状態でソケットを閉じたときの動作を制御します。valueにはbooleanの値をとる'on'と、秒のタイムアウトをあらわす数の値をとる'timeout'のエントリーを持つテーブルになります。'on'フィールドにtrueを指定すると、システムはデータの転送が完了するか'timeout'が経過するまでまで閉じる処理をブロックします。'on'がfalseで閉じた場合、システムはできるだけ速く処理ができるように閉じる処理を行います。ゼロ以外の値をこれに指定するのはお勧めしません。
- 'reuseaddr' : このオプションbindを呼ぶときに指定するアドレスのチェックを行うときにローカルアドレスの再利用を許可するかどうかを示します。
- 'tcp-nodelay': このオプションをtrueにすると接続中にNagleアルゴリズムを無効にします。
成功した場合、1を返します。
エラーの場合、nilを返します。
注意:上記の記述はman pageからのものです。
master:setstats(received, sent, age)
client:setstats(received, sent, age)
server:setstats(received, sent, age)
ソケットの情報をリセットします。これは使用帯域を調べるのに役立ちます。receivedで新しく受信バイト数を指定します。sentで新しく送信バイト数を指定します。ageで新しい接続時間を秒で指定します。
成功した場合、1を返します。
エラーの場合、nilを返します。
master:settimeout(value [, mode])
client:settimeout(value [, mode])
server:settimeout(value [, mode])
オブジェクトのタイムアウトの値を変更します。デフォルトでは全てのI/O操作はブロックします。したがってsend,receive,acceptメソッドは操作が完了するまで無制限にブロックすることになります。
settimeoutはI/Oメソッドがブロックできる時間制限を設定します。
タイムアウトを設定してその時間が経過した場合、そのメソッドはあきらめてエラーコードを返します。
タイムアウトの時間はvalueで秒単位で指定します。2つのタイムアウトモードがあり、両方一緒に指定することもできます。
- 'b' : blockタイムアウト。1つのI/O操作が完了するまで、LuasocketがOSにブロックする最大時間を指定します。
- 't' : totalタイムアウト。Luaスクリプトが呼び出して返ってくる前のブロックする最大時間を指定します。
タイムアウトのvalueにnilを指定すると無制限にブロックします。負の値を指定しても同じように動作します。
注意:タイムアウトの時間はLuasocketではミリ秒の精度を持っていますが、大きなブロックはOSからOSへ、LuaインタプリタからLuaインタプリタへライブラリがブロックを転送するので、タイムアウトの時間が守られないことがあります。
また、ホスト名を指定した場合は、名前解決のリゾルバによるブロックによって、指定したタイムアウトよりも大きくなる場合があります。
注意:古いtimeoutメソッドは推奨されません。名称、は他の全てのメソッド名が自身の本質を明白にする動詞を含んでいるので統一するために変更されました。
client:shutdown(mode)
全二重の接続の一部をシャットダウンします。モードはどの方向の接続をシャットダウンするかの値をとります。
- "both" : 送信と受信を禁止します。これがデフォルトのモードになります。
- "send" : 送信を禁止します。
- "receive" : 受信を禁止します。
この関数は1を返します。
2007年12月12日(水) 13:34:35 Modified by shfox