2012-03-19 7 views
0

私はC++でソケットを扱おうとしています。私が今まで行っているソケットとの唯一の仕事は、Javaでいた(私は具体的には、IRCボットを作成した)、私が使用したコードは、次のように見えた -JavaのバッファリングされたストリームとC++のソケットとの違いは?

Socket socket = new Socket(host, port); 
BufferedWriter writer = new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream())); 
BufferedReader reader = new BufferedReater(
          new InputStreamWriter(socket.getInputStream())); 

その後、読んで私のボットのために私はなるだろう新しいスレッドとwhileループを開始 -

String line; 
while((line = reader.readLine()) != null) ... 

と書き込みに -

writer.write(text); 
writer.flush(); 

を今私はCでそうしようとしてる++、物事は低いレベルではもちろんあり、私はしないでください私がやっていることをよく理解している。私はwinsock.hを使用していくつかのチュートリアルを探して、無駄にそれらを試してみました。私の友人はソケットライブラリsdl_netを勧めました。

私の質問は、C++のコードがJavaのIRCボットに使用したコードとどう違うのですか?また、Javaの「Buffered」ストリームとC++の低レベルソケットの違いは何ですか?

+0

高レベルのC++ネットワークコード用に[Boost.Asio](http://www.boost.org/libs/asio)ライブラリを使用することをお勧めします。 – ulidtko

答えて

0

、このチュートリアルでは、おおよそC++がどのようになるかを示していnew Socket()

C++ストリームは、バッファリングが実行されていないという点でraw socket.get(Output|Input)Stream()ストリームに似ています。Buffered(Output|Input)Streamは、write()/read()を呼び出すたびに、書き込まれた/読み込まれたバイトを基本のストリームに書き込むのではなく、バッファに格納します。 flush()を呼び出すと、バッファされたデータが強制的に書き込まれます。

+0

bind()ではなくconnect()です。 – EJP

+0

ありがとう、それは多くの助けになります。 –

+0

@EJP、良い点、私は答えを更新しました。 – SimonC

0

バッファリングの主な考え方は、チャンク内のデータを抽出/格納する機能(例:完全な行を読み取る機能)を提供し、パフォーマンスを向上させることです。

バッファリングは、ソケットまたは他の同様のAPIとは異なります。基礎となる入力デバイス(ソケットなど)は、バッファリングの上位レベルを意識する必要はありません。同時に、バッファリングは、基になる入力がキーボードかソケットか他のデバイスからのものであるかどうかを区別しません。 例えば、BufferedReaderクラスを使用するJavaの場合、基礎となる入力クラスは、文字や単語のまとまりでデータを読み書きするために使用できるインタフェースを提供する必要があります。

BufferedWriterは、文字単位または文字単位でデータを書き出し、明示的にflushが呼び出されたときにそれをフラッシュする(入力デバイス、ここではソケットに送る)またはオブジェクトが破壊されるか、バッファがいっぱいです(maxlenは1024文字)。

BufferedReaderの場合と同様に、ソケットから1文字を読み込むと、内部的に1024文字を読み込み、1文字返します。 1024文字までの次の読み込みでは、以前の時間がかかるソケット呼び出しを節約し、内部読み込みバッファから即座に使用できます。

同じバッファリングされたクラスをC++で簡単に実装することができます。このクラスは、まったく同じ機能を提供するソケットシステムコールを簡単にラップします。バッファリングのために、strstream/stringstream stdクラスを使用して文字列を読み書きすることができます。

http://www.linuxhowtos.org/C_C++/socket.htm

http://www.linuxhowtos.org/data/6/client.c

基本的に、あなたは代わりのにsocket()connect()コールを使用する必要があります:あなたの主な質問に答えるために

+0

説明が分かります。ありがとう –

関連する問題