Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > opensslライブラリ > OpenSSL::Bufferingモジュール > write_nonblock

instance method OpenSSL::Buffering#write_nonblock

write_nonblock(s) -> Integer[permalink][rdoc]

文字列 s をノンブロッキングモードで書き込みます。

成功した場合、書き込んだバイト数を返します。

1 バイトも書くことができず、ソケットの状態が変化するのを 待つ必要がある場合は例外を発生させます。 例外が発生した場合、内部のソケットが利用可能になってから 再びこのメソッドを呼んでください。

ただし内部バッファに書き込んでいないデータが残っている場合は、 まずバッファの内容をすべて出力してします。この時点で ブロックする可能性があります。

基本的には IO#write_nonblock と同様です。しかし以下のような 違いもあります。

このメソッドはソケットが読み込み不可能(IO::WaitReadable) という理由で 例外を発生させる可能性があります。暗号プロトコルの関係上 データの書き込みになんらかのデータの 送受信が必要になる場合があるからです。

内部のソケットが読み込み/書き込み可能である場合でも、このメソッドで 文字列を書き込めず、例外が発生する場合があります。 というのは、暗号プロトコルによっては(とくにブロック暗号では) 通信データをある程度の大きさのブロック単位で暗号化/復号化 するためです。

[PARAM] s:
出力する文字列
[EXCEPTION] OpenSSL::SSL::SSLError:
ソケットが読み込み/書き込み可能状態になるのを 待つ必要がある場合に発生します。 読み込み可能状態を待つ必要がある場合には IO::WaitReadable を、 書き込み可能状態を待つ必要がある場合には IO::WaitWritable を、 それぞれ extend した例外オブジェクトが生成されます。