socketネームスペース
socketネームスペースにはLuaSocketのコアの機能が含まれています。
socketネームスペースを取得するには次のようにします。
ローカルのaddressとportでbindし、クライアント接続を受け付ける準備ができています。
オプションとして、backlog引数をlistenメソッドに引き渡すことができます(デフォルトは32です)。
注意:サーバオブジェクトはオプション"reuseaddr"にtrueを設定されたものが返されます。
リモートaddressとportに接続します。オプションとしてbindするローカルアドレス(locaddr)とポート(locport)を指定することができます。
finalizerはtryが例外を投げたときに呼ばれる関数です。
これはprotectedモードで呼ばれます。
関数はカスタマイズされたtry関数を返します。
注意:このアイデアはLuaSocketでプロトコルの実装の多くを助けてくれました。
この関数はtry,newtry関数によって投げられる例外だけをキャッチします。
通常のLuaエラーはキャッチします。
funcはtry(もしくはassert,error)を呼び出して例外を投げる関数です。
例外を投げる代わりに同等の関数を返し、nilをに続いてエラーメッセージを返します。
注意:あなたの関数がなにか不正な操作を行いエラーを投げた場合、protected関数はエラーをキャッチし、それを文字列として返します。
これはtry関数が例外を投げる仕組みとしてエラーを使用しているからです。
recvtはデータを読み込むことができるかどうかチェックするソケットの配列です。
sendtはデータをすぐに書き込めるかチェックするソケットの配列です。
timeoutは状態変化を待つ最大の時間(単位:秒)です。
nilや負の数を指定した場合や省略した場合、この関数は無制限にブロックします。
recvtとsendtは空のテーブルやnilを指定することもできます。
ソケットでない値(もしくは数字でないインデックスの値)が配列に含まれる場合、それらは単に無視されるだけです。
この関数は読み込む準備のできたソケットのリストと書き込む準備ができているソケットのリスト、そいて1つのエラーメッセージを返します。
エラーメッセージは、タイムアウト状態になった場合は"timeout"で、それ以外の場合はnilです。
返されるテーブルは2重のキーが設定されていて、整数とソケット自身がキーになっています。
これで指定したソケットの状態が変化したかを簡単に調べることができます。
重要:WinSockには既知の問題として、ノンブロッキングTCPソケットのselectで失敗するというものがあります。
この関数は書き込む準備ができていないのに書き込み可能なソケットとして返すかもしれません。
重要:サーバオブジェクトで、acceptを呼ぶ前にrecvtパラメータを通してsocket.selectを呼んでも、
acceptがすぐに返ってくることは保証されません。settimeoutメソッドを使うか、別のクライアントが接続するまでのブロックを受け入れてください。
注意:閉じたソケットをselectに渡した場合、無視されます。
modeはシンクの動作を指定します。次のオプションが利用できます。
socketはデータを送信するのに使用するソケットです。
この関数は適切な動作のシンクを返します。
dは破棄する引数の数です。ret1からreNは引数です。
この関数はret[d+1]からret[N]を返します。
注意:この関数はダミー変数の作成を避けるのに役に立ちます。
timeはsleepする秒数です。
modeはソースの動作を指定します。次のオプションが利用できます。
socketはデータを受信するのに使用するソケットです。
この関数は適切な動作のソースを返します。
この関数から返された値から引き算して、意味のある値を取得してください。
例外はprotect関数によってのみキャッチすることができます。
それはエラーメッセージでは爆発しません。
ret1からretNは任意の引数です。しかし、通常関数呼び出しの返り値はtryでネストされます。
この関数はret1がnilでなければret1からretNを返します。
そうでない場合、errorを呼びret2をわたします。
socketネームスペースを取得するには次のようにします。
-- ソケットモジュールをロード local socket = require("socket")
socket.bind(address, port [, backlog])
この関数はTCPサーバオブジェクトを作成するショートカットです。ローカルのaddressとportでbindし、クライアント接続を受け付ける準備ができています。
オプションとして、backlog引数をlistenメソッドに引き渡すことができます(デフォルトは32です)。
注意:サーバオブジェクトはオプション"reuseaddr"にtrueを設定されたものが返されます。
socket.connect(address, port [, locaddr, locport])
この関数はTCPクライアントオブジェクトを作成するショートカットです。リモートaddressとportに接続します。オプションとしてbindするローカルアドレス(locaddr)とポート(locport)を指定することができます。
socket._DEBUG
この値がtrueの場合、ライブラリはデバッグサポート付でコンパイルされています。socket.newtry(finalizer)
例外が発生する前に処理を行うための、クリーンなtry関数を作成し返します。finalizerはtryが例外を投げたときに呼ばれる関数です。
これはprotectedモードで呼ばれます。
関数はカスタマイズされたtry関数を返します。
注意:このアイデアはLuaSocketでプロトコルの実装の多くを助けてくれました。
foo = socket.protect(function() -- somewhereと接続 local c = socket.try(socket.connect("somewhere", 42)) -- エラーが発生したら'c'をcloseするtry関数を作成 local try = socket.newtry(function() c:close() end) -- 何が起きてもcがcloseされます try(c:send("hello there?\r\n")) local answer = try(c:receive()) ... try(c:send("good bye\r\n")) c:close() end)
socket.protect(func)
例外を投げる関数を安全な関数に変換します。この関数はtry,newtry関数によって投げられる例外だけをキャッチします。
通常のLuaエラーはキャッチします。
funcはtry(もしくはassert,error)を呼び出して例外を投げる関数です。
例外を投げる代わりに同等の関数を返し、nilをに続いてエラーメッセージを返します。
注意:あなたの関数がなにか不正な操作を行いエラーを投げた場合、protected関数はエラーをキャッチし、それを文字列として返します。
これはtry関数が例外を投げる仕組みとしてエラーを使用しているからです。
socket.select(recvt, sendt [, timeout])
複数のソケットの状態変化を待ちます。recvtはデータを読み込むことができるかどうかチェックするソケットの配列です。
sendtはデータをすぐに書き込めるかチェックするソケットの配列です。
timeoutは状態変化を待つ最大の時間(単位:秒)です。
nilや負の数を指定した場合や省略した場合、この関数は無制限にブロックします。
recvtとsendtは空のテーブルやnilを指定することもできます。
ソケットでない値(もしくは数字でないインデックスの値)が配列に含まれる場合、それらは単に無視されるだけです。
この関数は読み込む準備のできたソケットのリストと書き込む準備ができているソケットのリスト、そいて1つのエラーメッセージを返します。
エラーメッセージは、タイムアウト状態になった場合は"timeout"で、それ以外の場合はnilです。
返されるテーブルは2重のキーが設定されていて、整数とソケット自身がキーになっています。
これで指定したソケットの状態が変化したかを簡単に調べることができます。
重要:WinSockには既知の問題として、ノンブロッキングTCPソケットのselectで失敗するというものがあります。
この関数は書き込む準備ができていないのに書き込み可能なソケットとして返すかもしれません。
重要:サーバオブジェクトで、acceptを呼ぶ前にrecvtパラメータを通してsocket.selectを呼んでも、
acceptがすぐに返ってくることは保証されません。settimeoutメソッドを使うか、別のクライアントが接続するまでのブロックを受け入れてください。
注意:閉じたソケットをselectに渡した場合、無視されます。
socket.sink(mode, socket)
ソケットオブジェクトのストリームからLTN12?シンクを作成します。modeはシンクの動作を指定します。次のオプションが利用できます。
- "http-chunked" : chunked transfer codingを適用した後、データを送信します。送信が終わるとソケットを閉じます。
- "close-when-done" : ソケットのすべての受信データを送信したら、ソケットを閉じます。
- "keep-open" : ソケットのすべての受信データを送信しても、開いたままにします。
socketはデータを送信するのに使用するソケットです。
この関数は適切な動作のシンクを返します。
socket.skip(d [, ret1, ret2, ... retN])
引数の数を破棄し、残りを返します。dは破棄する引数の数です。ret1からreNは引数です。
この関数はret[d+1]からret[N]を返します。
注意:この関数はダミー変数の作成を避けるのに役に立ちます。
-- SMTPサーバからの応答からステータスコードと区切り文字を取得します。 local code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
socket.sleep(time)
プログラムの動作を指定時間停止します。timeはsleepする秒数です。
socket.source(mode, socket [, length])
ソケットオブジェクトのストリームからLTN12ソースを作成します。modeはソースの動作を指定します。次のオプションが利用できます。
- "http-chunked" : ソケットからデータを受信し、chunked transfer codingを解除してからデータを返します。
- "by-length" : ソケットから固定長バイト受信します。このモードは追加の引数lenghtを必要とします。
- "until-closed" : 相手が接続を閉じるまでソケットからデータを読み込みます。
socketはデータを受信するのに使用するソケットです。
この関数は適切な動作のソースを返します。
socket.gettime()
世界が誕生してからの相対的な時間を秒で返します。この関数から返された値から引き算して、意味のある値を取得してください。
t = socket.gettime() -- なにかする print(socket.gettime() - t .. " seconds elapsed")
socket.try(ret1 [, ret2 ... retN])
エラーが発生した場合、例外をなげます。例外はprotect関数によってのみキャッチすることができます。
それはエラーメッセージでは爆発しません。
ret1からretNは任意の引数です。しかし、通常関数呼び出しの返り値はtryでネストされます。
この関数はret1がnilでなければret1からretNを返します。
そうでない場合、errorを呼びret2をわたします。
-- 接続する、もしくは適切なエラーメッセージを持った例外を投げます。 c = socket.try(socket.connect("localhost", 80))
socket._VERSION
これは現在のLuaSocketのバージョンの文字列が入っています。2007年12月12日(水) 17:49:14 Modified by shfox