QSocket
QSocket class (意訳)
QSocket クラスはバッファーを用いたTCP コネクションを提供します。 非ブロッキングQIODeviceを提供し、QIODeviceのAPIをソケット特有のコードに修正・拡張します。頻繁に呼びそうな関数は、connectToHost(), bytesAvailable(), canReadLine()、QIODevice から継承した関数。 connectToHost()は最も多く使われる関数です。その名前が意味する通り、 指定されたホストへの接続をオープンします。 殆んどのネットワークプロトコルは、パケット指向か行指向のどちらかです。canReadLine()は、接続がまだ読まれていない行を含むかどうかを示します。bytesAvailable()は読み込み可能なバイト数を返します。 error(), connected(), readyRead(), connectionClosed() 等のシグナルは、接続の進行を通知します。他にもよく使われるシグナルがあります。hostFound() は、connectToHost()がDNSを引き終り、TCP接続を始めている時に発行されます。delayedCloseFinished()はclose()が成功した時に。bytesWritten()はQSocketがデータを"to be written"キューからTCPの実装に移したときに発行されます。 ソケットのためのいくつかのアクセス関数があります。 state()関数は、そのオブジェクトがアイドルか、DNS loopupをしているか、 接続しているのか、もしくは接続に対し何かのオペレーションんをしているのか、 等を返します。address()とport()は、その接続で使われているIPアドレスとポートを返します。peerAddress()とpeerPort()関数は、ピアに使われるIPアドレスとポート番号を返します。そしてpeerName()関数はピアの名前(普通、それはconnectToHost()関数に渡されたホスト名)。socket()関数はこのソケットのQSocketDeviceへのポインタを返します。 QSocketはQIODeviceを継承し、幾つかの関数を再実装します。一般に、殆んどの読み込み・書き込みに対して、QIODeviceと同じように扱う事ができます。QIODevice APIは、同じマシンに制御されるデバイスのためにデザインされているので、全く非同期peer-to-peerネットワーク接続ではありません。例えば、QIODevice::sice()に対応するものは何もありません。 open(),close(),flush(),size(),at(),atEnd(),readBlock(),writeBlock(), getch(),putch(),ungetch(),readLine()のドキュメントの詳細に違いについての記述があります。 警告。QSocketはスレッド内で使用するのにふさわしくありません、 もしスレッド内で必要なら低レベルのQSocketDeviceクラスを使って下さい。
メモ
examples/network/mail/smtp.cpp では、
QSocketのインスタンスをQTextStreamに渡して、
ストリームを通じてソケットへ書き込みをしていた。
TODO:
emitの和訳、はシグナルに対してだから「発行する」でいいのかな。辞書引く。
viのsyntaxにキーワードemitを追加する。
non-blockingとは知らずに、connectToHost()直後にデータを読み込もうとしてはまりました。PHPのソケットでも同じような問題にはまってた様な気がする。今度から注意。機会があればより低レベルな部分でのSocketの実装も調べてみる。